C# 代码优先中的一对零关系

C# 代码优先中的一对零关系,c#,sql,entity-framework,C#,Sql,Entity Framework,我有以下表格结构: 用户: 用户ID 名称 乡下人 国家 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;} }

我有以下表格结构:

用户:
用户ID
名称
乡下人

国家
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;}
}
表Country存储了用户可以属于的10个可用国家的列表。不要因为数据库模型而杀了我,它必须是这样,遗留问题

通过fluent api,关系定义如下:

 modelBuilder.Entity<User>()
         .HasRequired<Country>(c => c.Country)
         .WithMany()
         .HasForeignKey(c => c.CountryId);
modelBuilder.Entity()
.HasRequired(c=>c.Country)
.有很多
.HasForeignKey(c=>c.CountryId);
问题是每次我尝试将新用户插入数据库时,定义的模型也尝试将新条目插入国家/地区表,我得到以下错误:

无法将值NULL插入到表“.countries”的列“id”中;列不允许空值。INSERT失败。\r\n语句已终止

为什么ef也会尝试在国家/地区表中插入一条新记录?我如何解决这一问题,仅插入一个新用户并从现有国家/地区列表中更新用户国家/地区?

尝试以下方法:

modelBuilder.Entity<User>()
     .HasOptional<Country>(c => c.Country)
     .WithMany()
     .HasForeignKey(c => c.CountryId);
modelBuilder.Entity()
.has可选(c=>c.Country)
.有很多
.HasForeignKey(c=>c.CountryId);

最可能发生的情况是,您添加的用户没有国家/地区:-

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);
或者您在创建要插入的用户时做了一些奇怪的事情,例如:-

var user = new User()
{
  ...
  Country = new Country() ... // This will create a new country!
};
如果是这种情况,您希望将用户链接到现有国家/地区:-

var user = new User()
{
  ...
  CountryId = countryId
};
试试这个:

public class Country
{ 
    public int Id {get; set;}
    public string Name {get; set;}
    public ICollection<User> Users { get; set; }
}
公共类国家
{ 
公共int Id{get;set;}
公共字符串名称{get;set;}
公共ICollection用户{get;set;}
}
以及:

modelBuilder.Entity()
.has可选(c=>c.Country)
.WithMany(c=>c.Users)
.HasForeignKey(c=>c.CountryId);

您能显示插入用户的代码吗?您是对的。问题是在插入用户时,没有执行如下操作:var country=ctx.Countries.FirstOrDefault(c=>c.Id==countryId);user.Country=Country;我在做user.Country=newcountry{Id=countryId;Name=“bla”},这是不正确的,因为我基本上是在创建一个新的国家。酷。对于记录,您不需要从上下文中选择国家,只需设置
user.CountryId=CountryId
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);