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

标签 c# .net ef-code-first entity-framework-4.3

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

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/

相关文章:

c# - 是否可以在插入/更新之前在 POCO 中执行操作?

c# - TraceSource.TraceTransfer 与 TraceSource.TraceEvent(TraceEventType.Transfer

c# - 使用不同颜色的 Material 绘制网格

c# - 在 .NET Core App 1.0.0 项目中引用 Framework 4.6 库

entity-framework - Database.SetInitializer 为 null 不起作用 Entity Framework 4.3.1 Code First

c# - 数据库操作预计影响 1 行,但实际影响 0 行

c# - 继续在 dotnet highchart 上画线

C# 属性初始化语法名称

c# - 使用枚举中的位置顺序创建枚举列表,而不是值

.net - Cosmos .NET SDK ReadManyItemsStreamAsync() 方法是否像其他查询 API 一样具有批量大小限制?