2014-05-13 87 views
2

我有以下表結構:在代碼優先1對零關係

用戶:
用戶ID
名稱
CountryId

國家
CountryId
名稱

其中表用戶的CountryId是國家/地區表的外鍵。
在代碼中,我有以下實體:

public class User 
{ 
    public int Id{get; set;} 
    public int CountryId {get; set;} 
    public virtual Country Country {get; set;} 
    public string Name {get; set;} 
} 



public class Country 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
} 

表國家存儲用戶可以屬於10個可用的國家名單。不要爲了數據庫模型而殺了我,它必須是這樣,遺留問題。

的關係被定義爲通過流暢API如下:

modelBuilder.Entity<User>() 
     .HasRequired<Country>(c => c.Country) 
     .WithMany() 
     .HasForeignKey(c => c.CountryId); 

的問題是每一次我嘗試插入一個新的用戶進入數據庫時​​,模型中定義試圖插入一個新進入該國表,以及和我得到以下錯誤:

Cannot insert the value NULL into column 'id', table '.countries'; column does not allow nulls. INSERT fails.\r\nThe statement has been terminated.

爲什麼EF試圖插入新記錄到該國表,以及我怎樣才能解決這個問題,只插入一個新的用戶和更新用戶的國家已有國家的名單?

+0

你能證明只需插入用戶的代碼? –

+0

你是對的。問題是插入用戶時,而不是像下面這樣做:var country = ctx.Countries.FirstOrDefault(c => c.Id == countryId); user.Country = country;我在做user.Country =新國家{Id = countryId;名稱=「bla」},這是不正確的,因爲基本上我正在創建一個新的國家。 – Elena

+1

涼爽。爲了記錄,你不需要從上下文中選擇國家,你可以設置'user.CountryId = countryId'。 –

回答

0

試試這個:

modelBuilder.Entity<User>() 
    .HasOptional<Country>(c => c.Country) 
    .WithMany() 
    .HasForeignKey(c => c.CountryId); 
2

什麼是最有可能發生的事情是,你要麼添加一個用戶沒有一個國家: -

var user = new User() 
{ 
    Name = "Elena" 
}; 
db.Users.Add(user); 

如果是這樣的話,你需要確保你可以添加一個沒有國家的用戶。

首先,您需要更改流暢API配置: -

modelBuilder.Entity<User>() 
    .HasOptional<Country>(c => c.Country) 
    .WithMany() 
    .HasForeignKey(c => c.CountryId); 

您還需要做出上的用戶可爲空的CountryId屬性: -

public class User 
{ 
    public int Id{get; set;} 
    public int? CountryId {get; set;} 
    public virtual Country Country {get; set;} 
    public string Name {get; set;} 
} 

,或者你做一些奇怪的事情,當你創建用戶插入,例如: -

var user = new User() 
{ 
    ... 
    Country = new Country() ... // This will create a new country! 
}; 

如果是這樣的話,您想將用戶鏈接到現有國家,而不是: -

var user = new User() 
{ 
    ... 
    CountryId = countryId 
}; 
0

試試這個:

public class Country 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
    public ICollection<User> Users { get; set; } 
} 

和:

modelBuilder.Entity<User>() 
    .HasOptional<Country>(c => c.Country) 
    .WithMany(c=>c.Users) 
    .HasForeignKey(c => c.CountryId);