实体框架代码首先是自定义属性

时间:2015-03-04 08:57:05

标签: entity-framework ef-code-first odatacontroller

我首先使用实体​​框架代码以及spa应用程序中的OData控制器,对于我的复合表(例如:Personnel - > PayRolls )我在NotMapped属性的部分类中添加了两个属性。因为我以后会在保存更改时使用它们。我检查是否已在客户端删除或修改记录,或者不保存在数据库中。

部分类是:

 public partial class PayRoll
{
    [NotMapped]
    public bool IsDirty { get; set; }

    [NotMapped]
    public bool IsDeleted { get; set; }
}

如果我在加载数据期间没有添加NotMapped属性,我会收到sql异常,其中显示无效的列名' IsDirty'。\ r \ n无效的列名' IsDeleted 。所以我添加NotMapped属性,使它理解它们不是数据库'表格字段。

但在保存数据期间我收到的错误显示:属性' IsDirty'在类型' Template.CodeFirst.PayRoll'上不存在。确保仅使用由类型定义的属性名称。它首先在实体框架数据库(.edmx文件)中运行良好。

oDataController上的Put方法是:

 // PUT: odata/Hrm_Personnels(5)
     [CheckKey("hrm.Personnels.Edit")]
    public IHttpActionResult Put([FromODataUri] int key, Personnel personnel)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        if (key != personnel.Id)
        {
            return BadRequest();
        }

        foreach (var payroll in personnel.PayRolls)
        {
            if (payroll.IsDirty)

                db.Entry(payroll).State = (payroll.ID > 0) ? EntityState.Modified : EntityState.Added;

           if (payroll.IsDeleted)

                db.Entry(payroll).State = EntityState.Deleted;
        }

        db.SaveChanges();

        db.Entry(personnel).State = EntityState.Modified;

        try
        {
            db.SaveChanges();
        }
        catch (DbUpdateConcurrencyException)
        {
            if (!PersonnelExists(key))
            {
                return NotFound();
            }
            else
            {
                throw;
            }
        }

        return Updated(personnel);
    }

提前致谢

1 个答案:

答案 0 :(得分:-1)

实际上第一个注释是正确的答案,通过使用下面的代码并从IsDirty和IsDeleted属性中删除NotMapped属性,问题就解决了。

 modelBuilder.Entity<PayRoll>().Ignore(c => c.IsDirty);
        modelBuilder.Entity<PayRoll>().Ignore(c => c.IsDeleted);