EF4 Code First - 如何正确映射多个表中的实体拆分

ner*_*rdn 5 mapping poco code-first entity-framework-4

我正在使用EF4 CTP5来尝试持久保存在两个表之间拆分的POCO对象,该链接是ContactID.当我保存联系人时,我希望将核心联系人信息保存在一个表(联系人)中,并将拥有该联系人的用户的链接保存在另一个表(UserToContacts)中.我有下面定义的自定义映射,但是当我SaveChanges时,我收到以下错误:

在多个位置生成跨实体或关联共享的值.检查映射是否将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");
        });
    }
Run Code Online (Sandbox Code Playgroud)

Mor*_*avi 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; }
}
Run Code Online (Sandbox Code Playgroud)

这意味着您有责任在创建新的联系人对象时提供有效的 PK。