Entity framework 4 EF4代码优先-如何正确映射跨多个表拆分实体

Entity framework 4 EF4代码优先-如何正确映射跨多个表拆分实体,entity-framework-4,mapping,poco,code-first,Entity Framework 4,Mapping,Poco,Code First,我正在使用EF4 CTP5尝试持久化一个POCO对象,该对象被拆分为两个表,链接是ContactID。保存联系人时,我希望核心联系人信息保存在一个表(Contacts)中,而指向拥有该联系人的用户的链接保存在另一个表(UserToContacts)中。我在下面定义了自定义映射,但当我保存更改时,会出现以下错误: 在多个位置生成跨实体或关联共享的值。检查映射是否不会将EntityKey拆分为多个存储生成的列。 任何想法都将不胜感激 protected override void OnMod

我正在使用EF4 CTP5尝试持久化一个POCO对象,该对象被拆分为两个表,链接是ContactID。保存联系人时,我希望核心联系人信息保存在一个表(Contacts)中,而指向拥有该联系人的用户的链接保存在另一个表(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");
        });
    }
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
///执行自定义映射
modelBuilder.Entity()
.Map(mc=>
{
mc.Properties(p=>new
{
p、 联系人ID,
p、 名字,
p、 MiddleName,
p、 姓氏
});
mc.ToTable(“联系人”);
})
.Map(mc=>
{
mc.Properties(p=>new
{
p、 联系人ID,
p、 用户ID
});
mc.ToTable(“UserToContacts”);
});
}

在CTP5发布后,EF团队在其代码库中修复了这一缺陷。实体拆分只会导致在其中一个表上使用标识,但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; }
}

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

只需不指定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");
    });
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
///执行自定义映射
modelBuilder.Entity()
.Map(mc=>
{
mc.Properties(p=>new
{
p、 名字,
p、 MiddleName,
p、 姓氏
});
mc.ToTable(“联系人”);
})
.Map(mc=>
{
mc.Properties(p=>new
{
p、 用户ID
});
mc.ToTable(“UserToContacts”);
});
}