2015-11-09 3 views
-1

я задаюсь вопросом, что было бы лучше, практика в этом сценарии:Entity Framework + «используя» шаблон передовой практики

У меня есть метод, который вызывает другой метод в использовании заявление (одноразовая Database Context), а другой метод также необходимо получить доступ к контексту базы данных, так что это вариант 1:

using (var db = new Database()) 
{ 
     // some code here 

     //calling other function 
     var cnt = SomeFunction(); 
} 

int SomeFunction() 
{ 
    using (var db = new Database()) 
    { 
     // some code here for example: 
     return db.Users.Count(); 

    } 
} 

А вот вариант 2:

using (var db = new Database()) 
{ 
    // some code here 

    //calling other function 
    var cnt = SomeFunction(db); 
} 

int SomeFunction(Database db) 
{ 
    return db.Users.Count(); 
} 

Примечание: Database выглядит л. как это:

public class Database : IdentityDbContext<User> 
{ 
    public Database() 
     : base("DefaultConnection", throwIfV1Schema: false) 
    { 
     Configuration.LazyLoadingEnabled = true; 
    } 


    public DbSet<IdentityUser> AspNetUsers { get; set; } 
} 

Я бы с вариантом 2, потому что нет никакой необходимости для инициализации контекста базы данных снова, но я не уверен, что это правильный способ сделать это.

+0

Я бы также пошел с опцией '2', но по лучшей причине: вы можете использовать' SomeFunction' интерфейс вместо конкретного типа базы данных. –

ответ

2

DbContext экземпляры имеют свой собственный changetracker. Если вы хотите использовать измененDbSet внутри SomeFunction, используйте тот же DbContext. Если нет, вы можете выбрать все, что пожелаете.

1

Я бы выбрал вариант 3: перегрузите SomeFunction.

int SomeFunction() 
{ 
    using (var db = new Database()) 
    return SomeFunction(db); 
} 

int SomeFunction(Database db) 
{ 
    return db.Users.Count(); 
} 

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

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

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