Entity framework 实体框架代码优先自定义属性
我首先在spa应用程序中使用实体框架代码和OData控制器,对于我的复合表,例如:personals->PayRolls,我在带有NotMapped属性的分部类中添加了两个属性。因为我以后在保存更改时使用它们。我检查记录是否已在客户端被删除或修改以保存在数据库中 部分类别为:Entity framework 实体框架代码优先自定义属性,entity-framework,ef-code-first,odata,odatacontroller,Entity Framework,Ef Code First,Odata,Odatacontroller,我首先在spa应用程序中使用实体框架代码和OData控制器,对于我的复合表,例如:personals->PayRolls,我在带有NotMapped属性的分部类中添加了两个属性。因为我以后在保存更改时使用它们。我检查记录是否已在客户端被删除或修改以保存在数据库中 部分类别为: public partial class PayRoll { [NotMapped] public bool IsDirty { get; set; } [NotMapped] publ
public partial class PayRoll
{
[NotMapped]
public bool IsDirty { get; set; }
[NotMapped]
public bool IsDeleted { get; set; }
}
如果在加载数据期间未添加NotMapped属性,则会出现sql异常,该异常显示无效的列名“IsDirty”。\r\n无效的列名“IsDeleted”。所以我添加了NotMapped属性,以使其理解它们不是数据库的表字段
但在保存数据的过程中,我遇到了一个错误,显示:类型“Template.CodeFirst.PayRoll”上不存在属性“IsDirty”。确保仅使用由类型定义的属性名称。不过,它与entity framework database first.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);
}
提前感谢实际上,第一条注释是正确的答案,通过使用下面的代码并从IsDirty和IsDeleted属性中删除NotMapped属性,问题就解决了
modelBuilder.Entity<PayRoll>().Ignore(c => c.IsDirty);
modelBuilder.Entity<PayRoll>().Ignore(c => c.IsDeleted);
尝试在您的上下文的onmodel创建中显式忽略它。我想知道您的问题是否与如何序列化分部类有关?因为我使用了代码优先的方法,所以我将IsDirty和IsDeleted属性添加到原始类,而不是上面的示例代码中的分部类,但这仍然没有任何区别,我仍然得到了错误。