EF4 Code First - Как правильно отобразить разделение сущности по нескольким таблицам - PullRequest
5 голосов
/ 16 февраля 2011

Я использую EF4 CTP5, чтобы попытаться сохранить объект POCO, который разделен на две таблицы, ссылка - это ContactID. Когда я сохраняю контакт, я хочу, чтобы основная контактная информация сохранялась в одной таблице (Контакты), а ссылка на пользователя, которому принадлежит контакт, сохранялась в другой (UserToContacts). У меня есть пользовательское отображение, определенное ниже, но когда я сохраняю изменения, я получаю следующую ошибку:

Значение, общее для сущностей или ассоциаций, генерируется в нескольких местах. Убедитесь, что сопоставление не разбивает EntityKey на несколько сгенерированных хранилищем столбцов.

Любые идеи будут с благодарностью!

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        /// Perform Custom Mapping
        modelBuilder.Entity<Contact>()
           .Map(mc =>
           {
               mc.Properties(p => new
               {
                   p.ContactID,
                   p.FirstName,
                   p.MiddleName,
                   p.LastName
               });
               mc.ToTable("Contacts");
           })
        .Map(mc =>
        {
            mc.Properties(p => new
            {
                p.ContactID,
                p.UserID
            });
            mc.ToTable("UserToContacts");
        });
    }

Ответы [ 2 ]

2 голосов
/ 16 февраля 2011

Это ошибка, которую команда EF исправила в своей базе кода после выпуска CTP5. Разделение сущностей должно привести только к тому, что идентичность будет использоваться в одной из таблиц, но CTP5 настраивает ее для всех таблиц (если вы посмотрите на свои таблицы, вы увидите, что ContactID настроен как столбец идентичности в обеих).

Обходной путь на данный момент заключается в том, чтобы вообще не использовать идентичность с разбиением таблицы:

public class Contact
{
    [DatabaseGenerated(DatabaseGenerationOption.None)]
    public int ContactID { get; set; }    
    public string FirstName { get; set; }
    public string MiddleName { get; set; }
    public string LastName { get; set; }

    public int UserID { get; set; }
}

Это означает, что вы несете ответственность за предоставление действительных PK при создании нового объекта Contact.

1 голос
/ 28 февраля 2012

Просто не указывайте идентификатор, он будет добавлен автоматически

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    /// Perform Custom Mapping
    modelBuilder.Entity<Contact>()
       .Map(mc =>
       {
           mc.Properties(p => new
           {
               p.FirstName,
               p.MiddleName,
               p.LastName
           });
           mc.ToTable("Contacts");
       })
    .Map(mc =>
    {
        mc.Properties(p => new
        {
            p.UserID
        });
        mc.ToTable("UserToContacts");
    });
}
...