如何在EntityFramework中映射可选的一对一关系

时间:2014-07-12 11:51:51

标签: c# entity-framework

我有2个模型,注册和注册码。注册可能只有一个注册码,注册码可能只有一个注册。

public class Registration
{
    public Registration()
    {
        RegistrationDate = System.DateTime.Now;
    }
    [Key]
    public int RegistrationID { get; set; }

    [DataType(DataType.DateTime)]
    public DateTime? RegistrationDate { get; set; }


    public RegistrationCode RegistrationCode { get; set; }
}

public class RegistrationCode
{
    [Key]
    public string Code { get; set; }

    public bool IsUsed { get; set; }

    public Registration Registration { get; set; }
}

我已尝试将关联映射到Fluent API,如下所示:

    modelBuilder.Entity<Registration>()
        .HasOptional(t => t.RegistrationCode)
        .WithOptionalPrincipal();

但问题是当我使用update-database重新创建数据库时,我的RegistrationCode表有以下字段,表明某些内容不对:

Code    nvarchar(50)    Unchecked
IsUsed  bit Unchecked
Registration_RegistrationID int Checked
Registration_RegistrationID1    int Checked

有人可以建议我该怎么做吗?

3 个答案:

答案 0 :(得分:0)

这将使实体之间产生一对一或零关系。

 modelBuilder.Entity<Registration>()
    .HasRequired(m => m.RegistrationCode)
    .WithOptional(t => t.Registration)

有关关系的详细信息,请按照MSDN

进行操作

答案 1 :(得分:0)

你不能创建这样的关系,因为左侧总是必须在右侧插入(右侧的pk将用于左侧),如果在右侧之前插入左侧,则会导致违反主键约束。正如@Ashish Rajput所说,你必须实施Required-to-Optional Relationship (One-to–Zero-or-One)Many-To-Many

答案 2 :(得分:0)

通过您的代码

modelBuilder.Entity<Registration>()
            .HasOptional(t => t.RegistrationCode)
            .WithOptionalPrincipal();

你告诉EF有一个主体(Registration),其关联不是模型的一部分。 除此之外Registration中有RegistrationCode个属性。 EF将此作为第二个外键。解决方法是告诉EF两者是相同的:

modelBuilder.Entity<Registration>()
            .HasOptional(t => t.RegistrationCode)
            .WithOptionalPrincipal(r => r.Registration);