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