我首先使用实体框架代码以及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);
}
提前致谢
答案 0 :(得分:-1)
实际上第一个注释是正确的答案,通过使用下面的代码并从IsDirty和IsDeleted属性中删除NotMapped属性,问题就解决了。
modelBuilder.Entity<PayRoll>().Ignore(c => c.IsDirty);
modelBuilder.Entity<PayRoll>().Ignore(c => c.IsDeleted);