1

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

部分类是:

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

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

如果我在加载数据期间未添加 NotMapped 属性,则会出现 sql 异常,显示Invalid column name 'IsDirty'。\r\nInvalid column name 'IsDeleted。所以我添加了 NotMapped 属性以使其了解它们不是数据库的表字段。

但在保存数据期间出现错误,显示:“Template.CodeFirst.PayRoll”类型上不存在“IsDirty”属性。确保仅使用由 type 定义的属性名称。它首先与实体框架数据库(.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);
    }

提前致谢

4

1 回答 1

-1

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

 modelBuilder.Entity<PayRoll>().Ignore(c => c.IsDirty);
        modelBuilder.Entity<PayRoll>().Ignore(c => c.IsDeleted);
于 2015-03-05T05:29:30.463 回答