EF Code First支持
1:1和
1:0..1建立关系。后者是您要寻找的内容(“一对零或一对”)。
是说你在流畅的尝试 需要在两端 在一种情况下和 可选的两端 中的其他。
您需要的是一端是 可选的 ,而另一端是 必需 的。
这是《编程EF代码第一书》中的示例
modelBuilder.Entity<PersonPhoto>().HasRequired(p => p.PhotoOf).WithOptional(p => p.Photo);
该
PersonPhoto实体呼叫导航属性
PhotoOf,它指向一个
Person类型。该
Person类型有一个叫做导航属性
Photo指向
PersonPhoto型。
在两个相关的类中,使用每种类型的 主键 ,而不是 外键
。即,您将不会使用
LoyaltyUserDetailId或
PIIUserId属性。而是,关系取决于
Id两种类型的字段。
如果您使用上述流利的API,则无需将其指定
LoyaltyUser.Id为外键,EF会予以解决。
因此,无需您的代码来测试自己(我讨厌从头开始)……我会将其翻译为您的代码,如下所示:
public class PIIUser{ public int Id { get; set; } public LoyaltyUserDetail LoyaltyUserDetail { get; set; }}public class LoyaltyUserDetail{ public int Id { get; set; } public double? AvailablePoints { get; set; } public PIIUser PIIUser { get; set; }}protected override void onModelCreating(DbModelBuilder modelBuilder){ modelBuilder.Entity<LoyaltyUserDetail>() .HasRequired(lu => lu.PIIUser ) .WithOptional(pi => pi.LoyaltyUserDetail );}这就是说LoyaltyUserDetails
PIIUser属性是 必需的, 而PIIUser的
LoyaltyUserDetail属性是可选的。
您可以从另一端开始:
modelBuilder.Entity<PIIUser>().HasOptional(pi => pi.LoyaltyUserDetail).WithRequired(lu => lu.PIIUser);
现在说PIIUser的
LoyaltyUserDetail属性是可选的,而LoyaltyUser的
PIIUser属性是必需的。
您始终必须使用模式HAS / WITH。
HTH和FWIW,一对一(或一对零/一)关系是最容易在代码中配置的关系之一,因此您并不孤单!:)



