Я пытаюсь обновить записи другого типа, но все они основаны на одном и том же базовом типе, BaseEntity
(у которого OwnerId
среди его членов)
Это сделано, чтобы я может передать право владения записями всех таблиц от одного пользователя другому.
Вот что мне нужно далеко:
public ActionResult TransferOwnership(int sourceUserId, int targetUserId)
{
var metadata = ((IObjectContextAdapter)Context).ObjectContext.MetadataWorkspace;
var tables = metadata.GetItems(DataSpace.SSpace).Where(x => x.BuiltInTypeKind == BuiltInTypeKind.EntityType).ToList();
foreach (var table in tables)
{
var tableName = table.GetType().GetProperty("Name").GetValue(table);
List<BaseEntity> entities = Context.Database.SqlQuery<BaseEntity>($"SELECT * FROM {tableName} WHERE OwnerId = {sourceUserId}").ToList();
foreach (var entity in entities)
{
entity.OwnerId = targetUserId;
Context.Entry(entity).State = EntityState.Modified; //this fails
}
if (entities.Count > 0)
Context.SaveChanges();
}
return Ok();
}
В строке, где я устанавливаю состояние сущности, я получаю ошибку говоря, что тип BaseEntity
не отслеживается контекстом.
Я мог бы использовать имя таблицы для приведения объекта к его реальному типу, но тогда мне нужно было бы сделать что-то вроде:
Context.MyTable1.Attach(entity);
Но это теряет свою общую привлекательность; Мне бы пришлось обратиться ко всей таблице явно.
Я помню, в более старой версии EF вы могли бы сделать что-то вроде Context.ChangeTracker.Attach(entity)
, но этого, похоже, уже нет.
Есть идеи?