2
public class ObjectA 
{ 
    public Guid Id {get; set;} 
    public virtual ObjectB Objectb {get; set;} 
} 

public class ObjectB 
{ 
    public Guid Id {get; set;} 
    public Guid ObjectAId {get; set;} 
    public virtual ObjectA ObjectA {get; set;} 
} 

我沒有運氣讓關係正確。創建EF 4.3關係不對

modelBuilder.Entity<ObjectA>() 
    .HasRequired(p => p.ObjectB) 
    .WithRequiredPrincipal() 
    .WillCascadeOnDelete(false); 

兩個關係:

  1. Object.ObjectA/ObjectA.Id
  2. ObjectA.Id/ObjectB.Id

我怎麼EF停止創造的關係#2?這是不正確的,不是我想要的。

錯:

modelBuilder.Entity<ObjectA>().HasRequired(x => x.Objectb).WithRequiredPrincipal(x => x.ObjectA); 

    ALTER TABLE [dbo].[ObjectBs] WITH CHECK ADD CONSTRAINT [FK_ObjectBs_ObjectAs_Id] FOREIGN KEY([Id]) 
    REFERENCES [dbo].[ObjectAs] ([Id]) 
    GO 

幾乎右:

modelBuilder.Entity<ObjectA>().HasOptional(x => x.Objectb).WithOptionalPrincipal(x => x.ObjectA); 

ALTER TABLE [dbo].[ObjectBs] WITH CHECK ADD CONSTRAINT [FK_ObjectBs_ObjectAs_ObjectA_Id] FOREIGN KEY([ObjectA_Id]) 
REFERENCES [dbo].[ObjectAs] ([Id]) 
GO 

一個附加列被添加,所以我最終ObjectAId和ObjectA_Id在對象B。

modelBuilder.Entity<ObjectA>().HasOptional(x => x.Objectb).WithOptionalPrincipal(x => x.ObjectA).Map(x => x.MapKey("ObjectAId")); 

引發異常:類型中的每個屬性名稱必須是唯一的。屬性名稱'ObjectAId'已經被定義。

回答

2

取自ObjectB刪除外鍵屬性:

public class ObjectA 
{ 
    public Guid Id {get; set;} 
    public virtual ObjectB Objectb {get; set;} 
} 

public class ObjectB 
{ 
    public Guid Id {get; set;} 
    public virtual ObjectA ObjectA {get; set;} 
} 

,並使用該映射用流利的API:

modelBuilder.Entity<ObjectA>() 
    .HasRequired(a => a.ObjectB) 
    .WithRequiredPrincipal(b => b.ObjectA) 
    .WillCascadeOnDelete(false); 

您需要刪除外國財產的原因是EF不支持一對一外鍵關聯,但僅支持One-to-One Shared Primary Key Associations

如果您想要一個一對一外鍵關聯,而該對外關係具有一個外鍵作爲與主鍵there is only a workaround不同的唯一鍵,從而將您的模型映射爲不帶導航屬性的一對多關係對關係的諸多方面,並在數據庫中唯一約束,就像這樣:

public class ObjectA 
{ 
    public Guid Id {get; set;} 
} 

public class ObjectB 
{ 
    public Guid Id {get; set;} 
    public Guid ObjectAId {get; set;} 
    public virtual ObjectA ObjectA {get; set;} 
} 

modelBuilder.Entity<ObjectB>() 
    .HasRequired(b => b.ObjectA) 
    .WithMany() 
    .HasForeignKey(b => b.ObjectAId) 
    .WillCascadeOnDelete(false); 
+0

謝謝你的解釋。我希望避免因使用它而刪除外鍵。我可以重構該代碼。 – cb3431 2012-04-25 23:27:21

2

這是Slauma作爲建議刪除外鍵的屬性後,終於什麼工作。

modelBuilder.Entity<ObjectA>() 
    .HasOptional(x => x.ObjectB) 
    .WithRequired(x => x.ObjectA) 
    .Map(x => x.MapKey("ObjectAId")) 
    .WillCascadeOnDelete(true); 

我必須映射屬性,否則在主鍵上創建外鍵。

+1

這真的讓我感到困擾。我想在地產中映射「ObjectAId」,因爲我使用它。 – Dherik 2015-02-27 01:13:25