2012-06-11 4 views
0

Есть ли способ отключить установку объекта Entity Framework?Как отключить вставку в Entity Framework?

Я использую DDD и в определенном ограниченном контексте некоторые требуемые поля базы данных таблицы пользователей не имеют смысла (внутри этого контекста). Поэтому я хочу удалить их из объекта User, но при этом я потерял возможность сохранять в базе данных нового пользователя. Это нормально, поскольку в этом контексте я не должен создавать пользователей.

Моя первая мысль заключалась в том, чтобы отключить вставку (но разрешить обновления) в пользовательском объекте.

Возможно ли это? Или, есть ли другое решение этой ситуации?

+0

Звучит для меня, что вы уже защищены в силу этого исключения, нет? Я считаю, что инвестиции в такую ​​«защиту» - пустая трата времени. Мне кажется, что «идентификация и доступ к mgmt» BC должна предоставить вам необходимые методы и представление запросов. –

+0

Возможно, вы правы. Но, когда усилия невелики, я всегда предпочитаю компилировать временные ошибки вместо исполняемых. – svallory

+0

Также представьте, что другой разработчик пытается выяснить, почему простая вставка бросает исключение. Это может занять много времени, пока он не осознает настоящую проблему. – svallory

ответ

2

Вы не можете отключить вставку, но вы можете найти, если какой-либо объект помечен для вставки и исключения пожара в таком случае.

Лучшее место, чтобы сделать такую ​​обработку в режиме вытеснения SaveChanges метода:

public override int SaveChanges(SaveOptions options) 
{ 
    if (ObjectStateManager.GetObjectStateEntries(EntityState.Added) 
          .Where(e => !e.IsRelationship) 
          .Select(e => e.Entity) 
          .OfType<User>() 
          .Any()) 
    { 
     throw new InvalidOperationException("User cannot be inserted"); 
    } 

    return base.SaveChanges(options); 
} 

Это поведение во время выполнения, но потому, что EF не отличается от операций модификации (все в одном SaveChanges) вы не можете обнаружить вставки во время компиляции.

+0

Спасибо! По крайней мере, я могу предоставить более значимую ошибку, если кто-то попытается вставить пользователя. – svallory

+0

Было бы лучше, если бы я мог расширить DbSet для создания ReadOnlyDbSet и переопределить метод «Добавить». Но ребята, стоящие за Entity Framework, решили сделать конструктор внутренним:/ – svallory

+0

Это не помогло, потому что есть другие способы вставить пользователя, не называя 'Add' на наборе. –