2011-02-16 33 views
2

我使用的代碼第一次CTP 5.我有一個父表和子表之間的一個相當簡單的設置代碼優先和親子引用

Create table testA (
    id int not null identity(1,1), 
    stuff varchar(200), 
    primary key (id) 
    ); 
go 

create table testB (
    id int not null 
     foreign key references testA(id), 
    morestuff varchar(200), 
    primary key (id) 
    ); 
go 

要指的是使用代碼首先,我們有這些表下面的結構:

namespace Test.Models 
{ 
    public class TestEntities : DbContext 
    { 
     public DbSet<testa> testa { get; set; } 
     public DbSet<testb> testb { get; set; } 

     protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) 
     { 
      base.OnModelCreating(modelBuilder); 

      modelBuilder.Entity<testa>().ToTable("testa"); 
      modelBuilder.Entity<testa>() 
       .Property(p => p.id) 
       .HasDatabaseGenerationOption(DatabaseGenerationOption.Identity); 

      modelBuilder.Entity<testb>().ToTable("testb"); 
     } 
    } 


    public class testa 
    { 
     public int id { get; set; } 
     public String stuff { get; set; } 

     public virtual testb testb { get; set; } 
    } 

    public class testb 
    { 
     public int id { get; set; } 
     public string morestuff { get; set; } 

     public virtual testa testa { get; set; } 
    } 
} 

當我嘗試將記錄添加到種皮,我得到的錯誤「當IDENTITY_INSERT設置爲OFF無法插入表‘種皮’標識列明確的價值。」

好的。不要識別Id是標識列,請先執行Code First。我們可以解決這個問題,所以我們告訴CodeFirst即testa.id是一個身份:

modelBuilder.Entity<testa>() 
     .Property(p => p.id) 
     .HasDatabaseGenerationOption(DatabaseGenerationOption.Identity); 

上述工作完成後,我們再次運行它,並得到另一個錯誤:「在ReferentialConstraint從屬屬性映射到一個存儲生成列。列:'id'「。那麼 - 這張照片有什麼問題?

我在做什麼錯,我該如何解決?

回答

3

在1:1關聯中,Code First將一個實體識別爲主體,將另一個識別爲從屬關係。然後它將主體PK作爲標識,並且在插入依賴表時需要處理有效的唯一PK。在你的情況下,它選擇testb作爲委託人,但看起來你希望testa成爲該協會的主要目標。這可以通過使用流利的API,基本上給予提示代碼優先實現哪一個是主要的,哪一個是依賴:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<testb>() 
       .HasRequired(b => b.testa) 
       .WithOptional(a => a.testb);     
} 

欲瞭解更多信息,看看這篇文章:
Associations in EF Code First CTP5: Part 2 – Shared Primary Key Associations