【问题标题】:Entity framework code first custom properties实体框架代码优先自定义属性
【发布时间】:2015-03-04 08:57:04
【问题描述】:

我首先在 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”属性。确保仅使用由类型定义的属性名称。不过,它首先与实体框架数据库(.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);
    }

提前致谢

【问题讨论】:

  • 尝试在 onModelCreating 的上下文中明确地 Ignore(x => x.IsDirty) 它。
  • 不知道您的问题是否与部分类的序列化方式有关?
  • 因为我使用了代码优先的方法,我将 IsDirty 和 IsDeleted 属性添加到原始类而不是部分类,如上面的示例代码,但它仍然没有任何区别,我仍然得到错误。跨度>

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    相关资源
    最近更新 更多