EF4 Code First — как правильно сопоставить разделение сущности между несколькими таблицами

Я использую 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");
        });
    }

person nerdn    schedule 16.02.2011    source источник


Ответы (2)


Это ошибка, которую команда 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.

person Morteza Manavi    schedule 16.02.2011

Только не указывайте ID, он будет добавлен автоматически

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");
    });
}
person Lander Verhack    schedule 28.02.2012