Entity Framework Code первые пользовательские свойства
Сначала я использую код структуры сущностей вместе с контроллерами OData в приложении spa, для своих составных таблиц (например: 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).
метод Put для oDataController:
// 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);
}
заранее спасибо
1 ответ
На самом деле первый комментарий является правильным ответом, и с помощью приведенного ниже кода и удаления атрибутов NotMapped из свойств IsDirty и IsDeleted проблема решена.
modelBuilder.Entity<PayRoll>().Ignore(c => c.IsDirty);
modelBuilder.Entity<PayRoll>().Ignore(c => c.IsDeleted);