Обработка вложенных объектов в Entity Framework

#c# #asp.net #entity-framework

#c# #asp.net #entity-framework

Вопрос:

Я немного пытаюсь разобраться в Entity Framework, и это сводит меня с ума. У меня есть целевой объект, который я хотел бы заполнить:

 public class ApiInvitationModel
{
    public int Id { get; set; }
    public EventModel Event { get; set; }
    public UserModel InvitationSentTo { get; set; }
    public UserModel AttendingUser { get; set; }
}
 

Схемы вышеуказанных моделей:

 public class EventModel {
    public int Id? { get; set; }
    public string Name { get; set; }
    public DateTime? StartDate { get; set; }
    public DateTime? EndDate { get; set }
    public OrganizationModel HostingOrganization { get; set; }
    public Venue Venue { get; set; }
    public string Price { get; set; }
}

public class UserModel {
    public int Id? { get; set; }
    public string Name  { get; set; }
    public string PhoneNumber { get; set; }
    public string MobileNumber { get; set; }
    public List<OrganizationModel> Organizations { get; set; }
}

public class OrganizationModel {
    public int Id? { get; set; }
    public stirng Name { get; set; }
    public string Address { get; set; }
    public UserModel PrimaryContact { get; set; }
}
 

Приведенные выше схемы упрощены для целей вопроса и являются моделями, которые мы намерены возвращать через API.

Проблема в том, что исходные схемы в базе данных сильно отличаются, и я пытаюсь сопоставить объекты базы данных с этими объектами с помощью Entity Framework 6.

Моя попытка решения состояла в том, чтобы попытаться вложить модели с помощью запроса, но это не сработало, и я не уверен, куда идти дальше, кроме многочисленных обращений к базе данных.

 public List<ApiInvitationModel> GetInvitations(int userId) {
    
    using (var entities = new Entities()) {
        return entities.EventInvitations
            .Join(entities.Users, invitation => invitiation.userId, user => user.id, (invitation, user) => new {invitation, user})
            .Join(entities.Events, model => model.invitation.eventId, ev => ev.id, (model, ev) => new {model.invitation, model.user, ev})
            .Join(entities.organization, model => model.user.organizationId, organization => organization.id, (model, organization) => new ApiInvitationModel 
            {
                Id = model.invitation.id,
                Event = new EventModel {
                    Id = model.event.id,
                    Name = model.event.name,
                    StartDate = model.event.startDate,
                    EndDate = model.event.endDate,
                    HostingOrganization = new OrganizationModel {
                        Id = model.invitation.hostingId,
                        Name = model.event.venueName,
                        Address = model.event.address,
                        PrimaryContact = new UserModel {
                            Name = model.event.contactName,
                            PhoneNumber = model.event.contactNumber,
                        }
                    }
                    ...
                },
                InvitedUser = {
                
                }
            }
            ).ToList();
    }

}
 

Как вы можете видеть выше, происходит довольно много вложенности, но, насколько мне известно, это не работает в Entity Framework 6. Я продолжаю получать следующие ошибки:

 "The type 'Entities.Models.API.UserModel' appears in two structurally incompatible initializations within a single LINQ to Entities query. A type can be initialized in two places in the same query, but only if the same properties are set in both places and those properties are set in the same order.",
 

Основываясь на приведенной выше ошибке, я предположил, что каждая из инициализаций модели должна быть одинаковой (т. Е. Инициализировать значения как одинаковые ApiInvitationModel в каждом соединении в том же порядке), но это приводит к той же ошибке.

Каков был бы наилучший подход к решению этой проблемы, имейте в виду, что в исходной базе данных не реализованы внешние ключи?

Комментарии:

1. вы используете подход CodeFirst или DatabaseFirst?

2. Сначала база данных @Ben.S

3. и я понимаю, что вышеупомянутый класс не является моделями? потому что, если они есть, они должны отражать схемы БД

4. Вы были бы правы, предполагая, что вышеуказанные классы не являются моделями базы данных

5. таким образом, вы можете извлекать необходимые данные с помощью моделей сущностей, а затем заполнять эти классы