Всякий раз, когда объект, который наследует от HistoricalData
, изменяется, я хочу сделать вставку вместо обновления.
Это абстрактный базовый класс с ключом {VersionID, ParentID}
:
public abstract class HistoricalData
{
public int VersionID { get; set; }
public Guid ParentID { get; set; }
public DateTime ValidFrom { get; set; }
}
Это мой подход в DbContext
:
public override Task<int> SaveChangesAsync()
{
foreach (var entry in ChangeTracker.Entries<HistoricalData>().Where(e => e.State == EntityState.Modified))
{
InsertInsteadOfUpdate(entry);
}
return base.SaveChangesAsync();
}
private void InsertInsteadOfUpdate(DbEntityEntry<HistoricalData> entry)
{
// ValidFrom is not set manually -> Set it automatically to now
if (entry.OriginalValues["ValidFrom"].Equals(entry.CurrentValues["ValidFrom"]))
{
entry.Entity.ValidFrom = DateTime.Now;
}
// Insert instead of Update
entry.CurrentValues["VersionID"] = null;
entry.State = EntityState.Added;
}
Я меняю VersionID
, потому что это столбец идентификаторов, и я хочу, чтобы база данных создала новое значение для вставки.
Однако я получаю следующее исключение:
System.InvalidOperationException: свойство «VersionID» является частью ключевой информации объекта и не может быть изменено.
Если я не попытаюсь изменить VersionID
, вставка завершится с ошибкой DuplicateKey Exception.
Есть ли способ изменить DbEntityEntry с Modified на Add с новым идентификатором?
Member 'CurrentValues' cannot be called for the entity of type 'CustomerData' because the entity does not exist in the context. To add an entity to the context call the Add or Attach method of DbSet<CustomerData>.
Есть ли другой способ сбросить VersionID? int не может быть обнулён:/ - person magnattic   schedule 09.04.2014entity.VersionID = default(int)
- person JC Ford   schedule 09.04.2014VersionID
, поэтому все, что мне нужно сделать, это установитьState
вAdded
. Если вы опубликуете свое решение в качестве ответа, я с радостью приму его. - person magnattic   schedule 09.04.2014HistoricalData
в качестве свойства коллекции/навигации в другом объекте, мне придется перезагружать его вручную. В моем случае:entry.Collection(x => x.Versions).Load();
, гдеVersions
— это коллекцияHistoricalData
. - person magnattic   schedule 09.04.2014