2011-02-16 23 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"); 
    }); 
} 
相關問題