c# - Code-First 中的一对零关系

标签 c# sql entity-framework

我有以下表结构:

用户:
用户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/

相关文章:

entity-framework - Entity Framework 中需要外键引用对象

c# - 异常记录和发送电子邮件

c# - TopShelf 如何捕获像 'install' 或 'start' 这样被我的 Main 方法忽略的参数?

sql - 数据库更新问题

mysql - 从日期中获取年份和月份

c# - 在高容量 IIS 网站上运行时 Entity Framework 会失败吗

c# - 无法以字符串格式从 JSON 重新创建 JSON 值

c# - 如何更改图表的视角和标签值.NET C#

sql - NOT EXISTS 无效关系运算符

c# - Entity Framework MVC 和多个数据库