2014-05-13 68 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);