entity framework中的单向一对一关系

下面的一对一关系示例抛出exception

public class User { public int Id { get; set; } public Address Address { get; set; } } public class Address { public int Id { get; set; } public User User { get; set; } } 

例外说:

无法确定类型“ConsoleApplication1.Address”和“ConsoleApplication1.User”之间关联的主要结尾。 必须使用关系流畅API或数据注释显式配置此关联的主要结尾。

如果我从地址中删除用户属性但我不想要它。

我怎么能有这样的关系,没有例外?

虽然Eranga提供的答案是正确的,并且在用户和地址之间创建了共享主键关联 ,但由于此映射类型的限制,您可能不想使用它。

以下是创建1:1关联的另一种方法,称为一对一外键关联 :

 protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity
() .HasRequired(a => a.User) .WithOptional(u => u.Address) .Map(m => m.MapKey("UserId")); }

EF Code First将此识别为1:1关联,因此允许您在用户和地址之间建立双向关联。

现在,您需要做的就是在UserId列上定义一个Unique Key约束,以使您的关系在数据库端真正一对一。 这样做的一种方法是使用已在自定义初始化程序类中重写的Seed方法:

 class DbInitializer : DropCreateDatabaseAlways { protected override void Seed(Context context) { context.Database.ExecuteSqlCommand("ALTER TABLE Addresses ADD CONSTRAINT uc_User UNIQUE(UserId)"); } } 

上面的代码将导致以下架构:

在此处输入图像描述

您需要使用流畅的API将关系映射为共享主键。

 public class MyContext : DbContext { protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity
() .HasRequired(a => a.User) .WithOptional(u => u.Address); } }