Entity Framework 在保存时抛出 Null 输入错误,C#

Entity Framework throwing Null entry error at Saving, C#

我正在研究 Entity Framework 6 和存储库设置以执行 crud 操作。我正在尝试在 table 之一中插入记录,但即使不是 duo,也会出现空条目错误。

{"Cannot insert the value NULL into column 'UI_ID', table 'Blackpool_BPM.dbo.COURSE_INSTANCE'; column does not allow nulls. INSERT fails.\r\nThe statement has been terminated."}

数据库连接正确,我可以毫无问题地读取数据

在通用存储库中,在 Save() 之前正确获取数据

Table结构

Class 型号

 [Table("COURSE_INSTANCE")]
public class BIZCourseInstanceEntity
{
    [Key]
    public int UI_ID { get; set; }

    public string UnitInstanceCode { get; set; }

    public string FESLongDescription { get; set; }

    public string FESShortDescription { get; set; }

    public string FullDescription { get; set; }

    public string OwningOrganisationCode { get; set; }

    public int? OwningOrganisationID { get; set; }

    public string TopicCode { get; set; }

    public string UnitCategory { get; set; }

    public string UnitCode { get; set; }

    public string FESQualificationType { get; set; }

    public int? SCHOOLS { get; set; }

    public int? MARKETING_GROUPS { get; set; }
}

存储库

 public class BIZCourseInstanceRepository : GenericRepository<BIZCourseInstanceEntity>
{
    public BIZCourseInstanceRepository() { }

    public BIZCourseInstanceRepository(DbContext dbContext)
        :base(dbContext)
    { }
}

工作单元class

  public class BIZ_UOF : IDisposable
{
    private BIZDbContext _BIZDbContextObject = new BIZDbContext();

    protected BIZCourseInstanceRepository _BIZCourseInstanceRepository;

 public BIZCourseInstanceRepository BIZCourseInstanceRepository
    {
        get
        {
            if (this._BIZCourseInstanceRepository == null)
            {
                this._BIZCourseInstanceRepository = new BIZCourseInstanceRepository(_BIZDbContextObject);
            }

            return _BIZCourseInstanceRepository;
        }
    }
    /////

   public void Save()
    {
        _BIZDbContextObject.Database.Log = s => System.Diagnostics.Debug.WriteLine(s);

        _BIZDbContextObject.SaveChanges();
    }

    private bool disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                _BIZDbContextObject.Dispose();
            }
        }
        this.disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

DbContext

public class BIZDbContext : BaseContext<BIZDbContext>
{
    public BIZDbContext() : base("_DbContext")
    { }

    public DbSet<BIZCourseInstanceEntity> BIZ_CourseInstance { get; set; }     
}

通用存储库 CRUD

 public void InsertEntity(TEntity obj)
    {
        _DbSet.Add(obj);
    }

函数 class 在 Save() 中生成错误

  public void InsertCourseInstance()
    {
        BIZCourseInstanceEntity BIZCourseInstanceEntityObject = null;

        BIZCourseInstanceEntityObject = new BIZCourseInstanceEntity
        {
            UI_ID = 999999,
            UnitInstanceCode = "KZ999999",
            FESLongDescription = "LONG",
            FESShortDescription = "SHORT",
            FullDescription = "FULL",
            OwningOrganisationCode = "E",
            OwningOrganisationID = 155,
            TopicCode = "04.1",
            UnitCategory = "04",
            UnitCode = "HE-G", 
            FESQualificationType = null,
            SCHOOLS = 5,
            MARKETING_GROUPS = 44

        };

        using (var _uow = new BIZ_UOF())
        {
            _uow.BIZCourseInstanceRepository.InsertEntity(BIZCourseInstanceEntityObject);

            _uow.Save();
        }
    }

您需要告诉Entity Framework您的 ID 是身份字段。如果它没有设置为数据库中的那个,那么你需要这样做。否则,您将需要查询下一个可用 ID,然后希望您不会与另一个试图同时保存内容的请求发生冲突。

[Table("COURSE_INSTANCE")]
public class BIZCourseInstanceEntity
{
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UI_ID { get; set; }
    ...
}

如果您绝对 必须在没有任何类型的数据库生成主键选项的情况下工作,您可以改为使用枚举的 DatabaseGeneratedOption.None 值。应该避免这种情况,以防止您的 PK 发生冲突,但该选项确实存在。

我找到了答案,问题出在我的数据库中,我需要提供主键,在我的例子中是 UI_ID 但在我的模型中我没有定义 DatabaseGeneredOption.None,因此抛出错误,感谢 Krillgar 指导我

这是更新后的模型

[Table("COURSE_INSTANCE")]
public class BIZCourseInstanceEntity
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int UI_ID { get; set; }

    [StringLength(255)]
    public string UnitInstanceCode { get; set; }

    [StringLength(255)]
    public string FESLongDescription { get; set; }

    [StringLength(255)]
    public string FESShortDescription { get; set; }

    [StringLength(255)]
    public string FullDescription { get; set; }

    [StringLength(255)]
    public string OwningOrganisationCode { get; set; }

    public int? OwningOrganisationID { get; set; }

    [StringLength(255)]
    public string TopicCode { get; set; }

    [StringLength(255)]
    public string UnitCategory { get; set; }

    [StringLength(255)]
    public string UnitCode { get; set; }

    [StringLength(50)]
    public string FESQualificationType { get; set; }

    public int? SCHOOLS { get; set; }

    public int? MARKETING_GROUPS { get; set; }
}