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

5
我正在使用EF4 CTP5尝试持久化一个分布在两个表中的POCO对象,链接是ContactID。当我保存联系人时,我希望将核心联系人信息保存在一个表(Contacts)中,并将与拥有该联系人的用户的链接保存在另一个表(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");
        });
    }
2个回答

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; }
}

这意味着在创建新的联系人对象时,您需要提供有效的主键。

1

不要指定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");
    });
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接