2013-05-18 50 views
1

我有以下情况:EF代码优先一对一的关系

public class User 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    // ... 
    public virtual Address Address { get; set; } 
} 

public class Address 
{ 
    public int ID { get; set; } 
    public string Street { get; set; } 
    public string ZipCode { get; set; } 
    // ... 
    public int UserID { get; set; } 
    public virtual User User { get; set; } 
} 

我不能为我的生活弄清楚如何设置流利的映射。我试过这个:

void Map(DbModelBuilder modelBuilder) 
{ 
    var entityConfiguration = modelBuilder.Entity<User>(); 
    entityConfiguration.HasKey(i => i.ID).Property(i => i.ID).HasColumnName("UserID"); 
    entityConfiguration.HasRequired(i => i.Address) 
     .WithOptional(i => i.User); 
    entityConfiguration.ToTable("MyUser"); 
} 

但它不好。它生成SQL,试图加入User.UserID = Address.AddressID

回答

2

EF正在为一对一映射创建正确的关系。你自己的专栏命名可能会让你感到困惑。

一个一比一的关系定义如下

User Table   Address Table 
----------   ------------- 
UserId PK    UserID PK, FK 
Name     ZipCode 

子表(地址)的主键也将是外键父表(用户)

如果您将包括UserID列在Address表中,并将其作为User表的外键,那么这将是一对多的关系而不是一对一的关系。

+0

我想让我的用户表具有零个或一个地址。我在这个地址表上有一个唯一的约束。 –

+0

在这种情况下,使映射像这样:entityConfiguration.HasOptional(i => i.Address).WithRequired(i => i.User); –

+0

这不起作用。这会生成错误的SQL。这是我已经。 –

相关问题