我需要使用LINQPad使用LINQ查询将记录从现有数据库加载到新数据库中。如果记录存在于数据库中,则更新名称。否则,插入记录。当前,新数据库为空。该脚本将定期运行,因此我必须检查更新。我有将现有记录和新记录加载到两个List中进行比较的代码。我遍历列表:
foreach (Coaster oldCoaster in listOfOldCoasters) {
var coaster = listOfNewCoasters.Where(c => c.coasterId == oldCoaster.coasterId).FirstOrDefault();
if (coaster != null) {
coaster.Name = oldCoaster.Name;
} else {
coaster = new Models.Coaster();
coaster.CoasterId = oldCoaster.coasterId;
coaster.Name = oldCoaster.Name;
//newCoasterDbContext.Coasters.Attach(coaster);
newCoasterDbContext.Coasters.Add(coaster);
}
}
newCoasterDbContext.SaveChanges();
当我使用“添加”方法运行代码时,收到异常“原始值不能用于处于添加状态的实体”。深入挖掘,我看到以下消息:
Cannot insert the value NULL into column 'CoasterId', table 'Coaster'; column does not allow nulls.
我正在设置有问题的主键,因此我必须缺少有关EF失败的一些信息。如果我取消注释“ Attach”语句并尝试使用它而不是“ Add”,则脚本将运行,但是没有任何内容插入数据库。
我的过山车课:
public class Coaster
{
public System.Guid CoasterId { get; set; }
public string Name { get; set; }
public Coaster()
{
CoasterId = System.Guid.NewGuid();
}
}
根据其他帖子,我尝试将属性添加到PK:
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
并且我尝试修改OnModelCreating方法:
HasKey(x => x.CoasterId).Property(x => x.CoasterId).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);
这些对我没有用。我错过了什么导致实体框架忽略我附加到主键字段的GUID?
答案 0 :(得分:0)
您不能解决愚蠢的问题,但是可以解决愚蠢的错误。正如我提到的那样,在OnModelCreating方法中,我有以下一行:
HasKey(x => x.CoasterId).Property(x => x.CoasterId).HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.None);
我认为这行不通,但这只是因为稍后在该方法中,有一行覆盖了更改:
Property(x => x.FpoDistrictId).HasColumnName(@"FPODistrictId").HasColumnType("uniqueidentifier").IsRequired().HasDatabaseGeneratedOption(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Identity);
至少我知道了...