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<Second>
{
    public SecondMapping ()
        : base()
    {
        this.HasOptional(s => s.First)
            .With ... ???
    }
}

Second 可能有对 First 的引用。但是 First 从来没有对 Second 的引用。是否可以将此映射应用于 Entity Framework 4.1?

编辑:
以前,这是我的解决方案:
this.HasOptional(s => s.First)
    .WithOptionalDependent()
    .WillCascadeOnDelete(false);

Second 可以包含 First 的一个实例(取决于某种 Usage-Attribute)。 First 不包含 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's blog 上描述了解决方法。解决方法基于一对多的映射关联,并通过在自定义数据库初始值设定项中引入唯一约束来强制执行数据库中的唯一性。

关于c# - Entity Framework 0..1 到 0 的关系,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5980260/

10-16 09:00