2015-09-26 2 views
2

Я пытаюсь применить единицу рабочего шаблона, как описано в this blog, но столкнулся с следующей проблемой: если я ввешу связанный DbSet только в репо, например,Объект обновления с использованием только DbSet

public ArticleRepository(DbSet<Article> articles) 
{ 
    this.articles = articles; 
} 

, то как мне обновить записи или изменить их статус?

Раньше я

public void Update(Article article) 
{ 
    this.context.Entry(article).State = EntityState.Modified; 
} 

но с новым подходом я не имею доступа к DbContext больше. Ни DbSet.Add, ни DbSet.Attach не будут работать здесь, так как я могу обновить объект в контексте?

+1

'IGenericRepository' должен быть полностью вашим дизайном. Вы можете добавить какой-либо метод для установки состояния для объекта. Такой интерфейс действительно выглядит как обертка. Поэтому, если возможно, попытайтесь разоблачить основную часть (DbContext, ...) через какой-либо другой скрытый интерфейс. При необходимости вы всегда можете получить доступ к ядру для выполнения некоторой *** задачи ***. В качестве обертки иногда он не может обеспечить полную работу как то, что вы можете делать с основными частями. Для меня этот шаблон основан на так называемой *** обертке ***. – Hopeless

+0

1. Вы можете получить доступ к контексту из 'DbSet'. 2. Не вводите 'DbSet', вводите сам контекст, а затем устанавливаете' this.articles', используя контекст. 3. Знаете ли вы, почему вы вообще абстрагируете контекст? Контекст Entity Framework уже имеет встроенный механизм «Единица работы». – haim770

ответ

3

System.Data.Entity.Migrations.IDbSetExtensions содержит расширение IDbSet AddOrUpdate <TEntity>. Это обновит объект.

Некоторые люди любят преимущество, не зная, добавляют ли они новую сущность или изменяют существующий.

Однако, если вы действительно хотите ошибку при обновлении элемента, который еще не добавил, посмотрите на Source Code of IDbSetExtensions.AddOrUpdate

Здесь вы можете увидеть, что функция сначала проверяет, если элемент существует и в зависимости от результат добавляет или обновляет его следующим образом:

var existing = set.SingleOrDefault 
    (Expression.Lambda<Func <TEntity, bool>> (matchExpression, new[] 
     {parameter})); 

if (existing != null) 
{ // entity exists: update it 
    foreach (var keyProperty in keyProperties) 
    { 
     keyProperty.Single().SetValue 
      (entity, keyProperty.Single().GetValue (existing, null), null); 
    } 
    internalSet.InternalContext.Owner.Entry(existing) 
     .CurrentValues.SetValues (entity); 
} 
else 
{ // not existing entity: Add it 
    internalSet.Add(entity); 
} 

Если вы не хотите AddOrUpdate, но на самом деле только обновление, рассмотрит Создание собственного метода расширения для IDbSet. См. Extension Methods (C# Programming Guide)

Смежные вопросы