【问题标题】:Unidirectional One-To-One relationship in Entity Framework实体框架中的单向一对一关系
【发布时间】:2012-05-15 01:12:54
【问题描述】:

下面的一对一关系示例引发异常

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 或数据注释。

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 我完全按照你说的做了,dbcontext 创建的数据库没有任何问题。但是当我检查表时,我发现用户表和地址表之间没有任何关系。呵呵
    • @Freshblood Address 的 PK 也应该是 User 表 PK 的 FK。
    • 我不明白我要做什么
    • @Freshblood 如果您允许 EF 创建数据库(例如:使用 IDatabaseInitializer),它将创建上述 FK。
    • @Erange 你试过了吗?我尝试过简单的应用程序,但它并没有真正创建。
    【解决方案2】:

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

    这是另一种创建 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)");
        }
    }
    


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-24
      • 1970-01-01
      相关资源
      最近更新 更多