C# 实体框架0..1到0关系
第二个可以包含第一个的一个实例(取决于某种用法属性)。第一个不包含第二个的任何实例。只有当外键也是依赖实体的主键时,才可能存在一对一关系。因此,正确的映射是:C# 实体框架0..1到0关系,c#,entity-framework,foreign-keys,C#,Entity Framework,Foreign Keys,第二个可以包含第一个的一个实例(取决于某种用法属性)。第一个不包含第二个的任何实例。只有当外键也是依赖实体的主键时,才可能存在一对一关系。因此,正确的映射是: this.HasOptional(s => s.First) .WithOptionalDependent() .WillCascadeOnDelete(false); 原因是要在数据库中强制执行一对一关系,外键必须在第二个实体中唯一。但实体框架不支持唯一的键——EF的唯一唯一值是主键。这是EF的局限性 上介绍了解
this.HasOptional(s => s.First)
.WithOptionalDependent()
.WillCascadeOnDelete(false);
原因是要在数据库中强制执行一对一关系,外键必须在第二个
实体中唯一。但实体框架不支持唯一的键——EF的唯一唯一值是主键。这是EF的局限性
上介绍了解决方法。解决方法基于将关联映射为一对多,并通过在自定义数据库初始值设定项中引入唯一约束来强制数据库中的唯一性。如果您试图实现一对一关系,其中最多只有一个
第二个实体与第一个实体关联,如果没有反向属性,请尝试以下操作:
class First
{
[Key]
public int Id { get; set; }
}
class Second
{
[Key, ForeignKey("First")]
public int Id { get; set; }
public First First { get; set; }
}
用EF语言说:它不应该是可选的:可选的关系,在关系的另一端没有导航属性吗?一旦你把FK放在PK上,它就不能是可选的-PK必须定义,因为需要具有相同PK值的主体实体。我编辑了我的帖子,以更详细地描述我的问题。请注意。我检查了您以前的代码,它创建了一对多relation@LadislavMrnka-您知道有什么方法可以用DatabaseFirst方法进行这种“黑客攻击”吗?还是只有流畅的映射才有可能?请注意我在上面Ladislav Mrnkas答案中的评论。
class First
{
[Key]
public int Id { get; set; }
}
class Second
{
[Key, ForeignKey("First")]
public int Id { get; set; }
public First First { get; set; }
}
class First
{
[Key]
public Guid FirstId { get; set; }
}
class Second
{
[Key]
public Guid FirstId { get; set; }
public First First { get; set; }
}
class SecondMapping : EntityTypeConfiguration<Second>
{
public SecondMapping()
{
this.HasRequired(s => s.First);
}
}
class SecondMapping : EntityTypeConfiguration<Second>
{
public SecondMapping()
{
this.HasRequired(s => s.First).WithMany().HasForeignKey("First_id");
}
}