2016-02-24 4 views
1

Я заметил, что в этом примере EntityFramework каждая функция имеет свой собственный оператор using с DbContext.Использование EF для сохранения всех изменений в контексте с помощью отдельной функции

Мой репозиторий немного отличается от того, где DbContext отправляется с использованием инъекции зависимостей и устанавливается как частное свойство.

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

public bool SaveAll() 
{ 
    return _context.SaveChanges() > 0; 
} 

И тогда есть некоторые функции в моем хранилище, что никогда не _context.SaveChanges и вместо того, чтобы просто добавить элементы в контексте. Затем, наконец, просто вызовите _repository.SaveAll(), чтобы сохранить все все одним выстрелом.

С другой стороны

Является ли это нормальным иметь некоторые функции, которые имеют сбережение встроены прямо в них, как это (в ситуации, когда вам нужно немедленно вернуть новый идентификатор созданного объекта:

public Product AddProduct(Product product) 
{ 
    _context.Add(product); 
    _context.SaveChanges(); 

    return product; 
} 

Похоже, у меня есть целый ряд функций, в течение моего проекта на основе потребностей, и я просто хочу, чтобы убедиться, что это является общим или увидеть, если есть лучший способ справиться с этими сценариями.

Repository функции:
-Вот только добавить к контексту
-Вот добавить в контекст, а затем сохранить контекст

+0

Любой подход может быть действительным в зависимости от смыслового значения, что делает функциональность. Если 'AddProduct' предназначен для атомной операции с побочными эффектами, то он может самостоятельно сохранить изменения. В противном случае потребительский код всегда должен был сохранить изменения сразу же после этого, что нежелательно и может не всегда выполняться. С другой стороны, если он предназначен для частичного набора операций в одной транзакции, то вызов 'SaveChanges()' несколько раз в течение такой транзакции может быть проблематичным. – David

+0

Итак, как вы думаете, что удалением с помощью функции SaveChanges(), которую я создал, и всегда вызывающей SaveChanges() в каждой отдельной функции, является мой лучший выбор? –

+0

Совсем нет. Я говорю, что это своего рода основанный на мнениях и будет зависеть от семантических и архитектурных проблем, не выявленных в вопросе. – David

ответ

1

нет нормально ... Но если вы обработки веб-запроса, то «нормальный «обычно указывает один экземпляр контекста для запроса, но любые операции, которые должны выполняться в БД до этого, нуждаются в их собственном выделенном DbContext. Тот факт, что у вас есть некоторые методы, которые добавляют в контекст и сразу же сохраняет, вызовет вас потому что вы делитесь этим контекстом. Как я уже говорил ранее, IMHO любые методы, которые сохраняют все сами по себе и могут рассматриваться как атомные операции, должны иметь собственный DbContext, созданный и уничтоженный внутри этой функции.

Так изменив атомарные операции с этим:

public Product AddProduct(Product product) 
{ 
    using(var context = new DbContext()) 
    { 
    context.Add(product); 
    context.SaveChanges(); 
    } 

    return product; 
} 
+0

Хорошо, так что вы говорите одну функцию, которую я показал выше, где _context.SaveChanges() на самом деле вызывается внутри самой функции, должен быть обернут при использовании (var db = new MyContext()), иначе, поскольку я имею дело с web, используя вложенный контекст должен использовать кучу функций, которые только добавляют к контексту, а затем, наконец, вызову SaveAll(). Имеют смысл? Есть ли способ обходной ситуации, когда мне нужно сразу же получить продукт, но все же разделил его на две отдельные функции или у меня нет выбора, кроме как делать то, что я делаю выше? –

+0

Отлично, ваше обновление именно то, что я хотел подтвердить. Так что нормально иметь как атомные операции, так и функции репозитория, которые только добавляют к контексту при разработке сети? –

+1

да, иногда вам нужны вещи, чтобы «быть там», прежде чем отправить массивную единицу работы. –

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

  • Нет связанных вопросов^_^