我有以下表结构:
用户:
用户ID
姓名
国家/地区 ID
国家
国家ID
姓名
其中表 user 中的 CountryId 是 Country 表的外键。
在代码中,我有以下实体:
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 个可用国家/地区的列表。不要因为数据库模型而杀了我,它必须是这样,遗留问题。
通过 Fluent 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 也会尝试将新记录插入国家/地区表中?如何修复此问题以仅插入新用户并从现有国家/地区列表中更新用户国家/地区?
最佳答案
最有可能发生的情况是您添加的用户没有国家/地区:-
var user = new User()
{
Name = "Elena"
};
db.Users.Add(user);
如果是这种情况,您需要确保您实际上可以添加没有国家/地区的用户。
首先,您需要更改 Fluent API 配置:-
modelBuilder.Entity<User>()
.HasOptional<Country>(c => c.Country)
.WithMany()
.HasForeignKey(c => c.CountryId);
您还需要将 User 的 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
};
关于c# - Code-First 中的一对零关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23629705/