[英]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.