【发布时间】: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