2011-02-16 53 views
5

我正在使用EF4 CTP5来尝试保留在两个表中分开的POCO对象,链接是ContactID。当我保存联系人时,我希望将核心联系人信息保存在一个表(联系人)中,并将拥有联系人的用户的链接保存在另一个表中(UserToContacts)。我有以下定义的自定义映射,但是当我SaveChanges时,出现以下错误:EF4代码优先 - 如何正确地映射分割实体跨多个表

跨多个实体或关联共享的值在多个位置生成。检查映射是否将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

这是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。

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"); 
    }); 
} 
相关问题