gpt4 book ai didi

c# - Entity Framework 中的单向一对一关系

转载 作者:行者123 更新时间:2023-11-30 13:15:17 25 4
gpt4 key购买 nike

下面一对一关系的例子抛出异常

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

异常说:

Unable to determine the principal end of an association between the types 'ConsoleApplication1.Address' and 'ConsoleApplication1.User'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.

如果我从 Address 中删除 User 属性但我不想这样做,它会起作用。

我怎么能毫无异常(exception)地拥有这样的关系?

最佳答案

虽然 Eranga 提供的答案是正确的并创建了一个 shared primary key association在 User 和 Address 之间,由于此映射类型的限制,您可能不想使用它。

这是另一种创建 1:1 关联的方法,称为 one-to-one foreign key association :

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

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

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

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


上面的代码将产生以下架构:

enter image description here

关于c# - Entity Framework 中的单向一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10466660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com