c# – 实体框架中的单向一对一关系

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

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.

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

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

最佳答案
虽然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列上定义一个Unique Key约束,以使您的关系在数据库端真正一对一.这样做的一种方法是使用已在自定义初始化程序类中重写的Seed方法:

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

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

转载注明原文:c# – 实体框架中的单向一对一关系 - 代码日志