entity framework0..1到0关系

class First { [Key] public int Id { get; set; } } class Second { [Key] public int Id { get; set; } public int? First_Id { get; set; } [ForeignKey("First_Id")] public First First { get; set; } } public class SecondMapping : EntityTypeConfiguration { public SecondMapping () : base() { this.HasOptional(s => s.First) .With ... ??? } } 

第二个可能参考First。 但是First从来没有提到过Second。 是否可以将此映射应用于Entity Framework 4.1?

编辑:以前,这是我的解决方案:

 this.HasOptional(s => s.First) .WithOptionalDependent() .WillCascadeOnDelete(false); 

第二个可以包含First的一个实例(取决于某种Usage-Attribute)。 首先不包含Second的任何实例。

只有当外键也是从属实体的主键时,才能实现一对一的关系。 所以正确的映射是:

 class First { [Key] public int Id { get; set; } } class Second { [Key, ForeignKey("First")] public int Id { get; set; } public First First { get; set; } } 

原因是要在数据库中强制实施一对一关系,外键在Second实体中必须是唯一的。 但entity framework不支持唯一键 – EF唯一的唯一值是主键。 这是EF的限制。

Morteza Manavi的博客上描述了解决方法。 解决方法基于将关联映射为一对多,并通过在自定义数据库初始化程序中引入唯一约束来强制执行数据库中的唯一性。

如果您尝试实现一对一关系,其中最多只有一个与First一个实体关联的First实体,并且没有反向属性,请尝试以下操作:

 class First { [Key] public Guid FirstId { get; set; } } class Second { [Key] public Guid FirstId { get; set; } public First First { get; set; } } class SecondMapping : EntityTypeConfiguration { public SecondMapping() { this.HasRequired(s => s.First); } } 

但是,您可以使用单独的First_id列来执行此类关联,但是您可以有效地创建1对N关系。 它可以通过UNIQUE约束“强制”为1对1,但由于EF的限制,您将无法创建反向属性(如Ladislav所述):

 class SecondMapping : EntityTypeConfiguration { public SecondMapping() { this.HasRequired(s => s.First).WithMany().HasForeignKey("First_id"); } }