2014-02-10 4 views
0

Сценарий:организация обновления и связанные с ними объекты

class Foo { 
    [Key] 
    public int Id { get; set; } 
    public List<Bar> Bars { get; set; } 
} 

class Bar { 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 

я должен реализовать простой CRUD-опа, как это:

public void InsertOrUpdateFoo(Foo foo) { 

    var db = new MyContext(); 

    //here some pseudocode 
    if (foo exists) { 

     d.Foos.Add(foo); 

    } else { 

     //here which is the best solution? 
     //a good tradeoff between performance and code semplicity 

     //case 1: delete first and add 
     db.Foos.Remove(oldFoo); 
     db.Add(foo); 
     db.SaveChanges(); 

     //case 2: there is some functionality that allows you to update the entity like: 
     db.Modify(oldEntity, newEntity); 

    } 

    db.Dispose(); 
} 

В сценарии обновления, который, кажется, чтобы быть лучшим выбором?

  1. Удаление и добавление
  2. Управление вручную обновление (Foreach subentities)
  3. Некоторые другие методы ??

ответ

0

На основе идеи в http://forums.asp.net/t/1889944.aspx вы можете проверить, является ли свойство ID объекта значением по умолчанию, например 0 для int. Если это так, это новое и должно быть добавлено. Если нет, то обновите его.

Это может быть указано в контексте его EntityState, как только объект привязан к контексту. Вы можете получить доступ к этому через DbEntityEntry объекта, используя метод Entry<T>() контекста.

Вы также захотите использовать инструкцию using при создании контекста, который будет управлять областью контекста и автоматически называть Dispose на нем, когда заканчивается блок.

Лучше разбить его на часть, которая фактически сохраняет изменения в виде вставки или обновления (скорее всего, это метод репозитория, но для простоты будет использоваться отдельно) и код, который управляет сущностью.

Определение метода (на основе кода):

public void InsertOrUpdateFoo(DbContext db, Foo foo) {   
    if (foo.ID == 0) { // assuming Foo's unique identifier is named ID 
     db.Entry(entity).State = EntityState.Added; 
    } else { 
     db.Entry(entity).State = EntityState.Modified; 
    } 
    db.SaveChanges(); 
} 

Использование:

// for when you're creating new entities 
var newFoo = new Foo(); 
newFoo.Name = "A Name"; 
using(var context = new MyContext()) 
{ 
    context.Add(newFoo); 
    InsertOrUpdate(context. newFoo); 
} 

// ... 
// for when you're using existing entities 
// you have an ID from somewhere in variable "id" 
using (var context = new MyContext()) 
{ 
    var existingFoo = context.Find(id); 
    if (existingFoo != null) 
    { 
     existingFoo.Name = "ChangedTheName"; 
     InsertOrUpdate(context, existingFoo); 
    } 
} 
Смежные вопросы