我正在使用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");
});
}
答案 0 :(得分: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; }
}
这意味着您有责任在创建新的Contact对象时提供有效的PK。
答案 1 :(得分: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");
});
}