繁体   English   中英

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

[英]How to map an optional one to one relationship in EntityFramework

我有2个模型,Registration和RegistrationCode。 一个注册可以有一个注册码,一个注册代码可以有一个注册码。

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

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

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

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

有关关系的更多详细信息,请遵循MSDN。

您无法创建这种关系,因为必须始终在右侧之后插入左侧(右侧的pk将用于左侧),并且如果左侧有时插入右侧,则可能导致违反主键约束。 正如@Ashish Rajput所说,您必须实现“ Required-to-Optional Relationship (One-to–Zero-or-One)或“ Many-To-Many

根据您的代码

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM