将新记录添加到EF失败,出现NULL列错误

时间:2018-11-13 14:14:00

标签: entity-framework

我需要使用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?

1 个答案:

答案 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);

至少我知道了...