2012-08-16 132 views
1

比方說,我們有這個EF代碼第1虛擬外鍵

class A 
{ 
    [Key] 
    public int Id { get; set; } 
    public string X { get; set; } 
    public string Y { get; set; } 
    public B B; 
} 

class B 
{ 
    [Key] 
    public int Id { get; set; } 
    public string X { get; set; } 
    public string Y { get; set; } 
    public virtual ICollection<A> As { get; set; } 
} 

假設X和Y的對保證是B中唯一的,因此{X,Y}可能是在B中的複合主鍵但不是,Id是。

Fluent API可以通過這個假外鍵關係來表達A.B應該是導航屬性嗎?

這樣的事情,但它不工作:

HasRequired(a => a.B).WithMany(b => b.As).HasForeignKey(a => new { a.X, a.Y }) 

回答

0

你說你想「假」的外鍵,我不知道這意味着你不希望你的數據庫,以反映關係。如果是這樣,那麼你不想流利地表達這一點,你應該在你的業務邏輯中強制執行。如果你確實需要一個真正的外鍵,那麼你需要改變B的主鍵,然後建立複合外鍵附件。您的初始班級A中存在拼寫錯誤,您沒有將導航屬性B作爲屬性創建。我認爲這些並不是你的真實對象,但我能夠得到這樣的工作是這樣的:

public class A 
    { 
     public int Id { get; set; } 
     public string X { get; set; } 
     public string Y { get; set; } 
     public virtual B B { get; set; } 
    } 

public class B 
{ 
    public int Id { get; set; } 
    public string X { get; set; } 
    public string Y { get; set; } 
    public virtual ICollection<A> As { get; set; } 
} 

public class Model : DbContext 
{ 
    public DbSet<A> As { get; set; } 
    public DbSet<B> Bs { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 

     modelBuilder.Entity<B>() 
      .HasKey(b => new { b.Id, b.X, b.Y }); 

     modelBuilder.Entity<A>() 
      .HasRequired(a => a.B) 
      .WithMany(b => b.As) 
      .HasForeignKey(a => new { a.Id, a.X, a.Y }); 
    } 
} 
+0

請注意,A和B的真正主鍵不是合成的。但是我想通過關聯的假組合鍵不包含Id,只包含X和Y.另外,我仍然需要將B上的Id作爲真正的主鍵。這意味着你的HasKey()不能用於我的情況。我只需要一個名爲B的導航屬性,它通過假複合鍵{X,Y}與B相關。 – pinkfloydhomer 2012-08-17 07:08:59