2013-05-18 78 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。這是我已經。 –

相關問題