Итак, в моем проекте EF4 я открыл частичные классы как самого файла DataContext, так и пару таблиц/объектов, сгенерированных DataContext. Однако, если я открою класс «Продукты» как частичный, не будет (насколько я могу судить) прямой ссылки от резервной копии продукта к классу DataContext, который его породил.
public partial class Product
{
public DataContext GetContext()
{
return this.DataContext;
// FAILS!!! No connection from 'this' to DataContext
// makes sense because "Product" isn't REALLY derived from DataContext
//...but still, I want this to work!
}
}
Но внутри класса частичного продукта я бы хотел иметь возможность напрямую запрашивать базу данных, и мне очень нравится иметь возможность инициализировать только один экземпляр DataContext и использовать его для моих запросов страницы aspx.cs, а также для запросов, выполняемых из разделяемых классов, вызываемых со страницы aspx.cs.
Итак, мое решение до сих пор состоит в том, чтобы передать экземпляр DataContext в качестве параметра 'ref' методам моего частичного класса, которые должны копаться в базе данных. Вот частичный класс:
public partial class Complaint
{
public IEnumerable<Person> GetPByRole(InvestigationRole roleEnum, ref DataContext dbase)
{
var role = dbase.GetRole(roleEnum);
return this.PeopleOnInvestigations
.Where(x => x.InvestigationRoleID == 1)
.Select(x => x.Person);
}
}
Итак, есть ли обратная сторона в передаче моего объекта DataContext в качестве параметра ref любым методам частичного класса, которым требуется доступ к базе данных через это соединение? Одним из преимуществ является то, что после передачи объекта в качестве ref , я могу "AddObject()" новые сущности из этих частичных классов, и как только мой обратный вызов SaveChanges на моей странице asp.cs выполнен, ВСЕ изменения (из aspx и из методов частичного класса) выполняются.
DataContext
, что касается производительности. Это никогда не было проблемой для меня. Особенно когда это касается операций чтения. Однако из-за атомарности вам может потребоваться меньшеDataContext
экземпляров на запрос. Что я обычно делаю, так это оборачиваю свои репозитории в единицу работы и позволяю этой единице работы управлять файломDataContext
. Я отделяю операции запросов от бизнес-транзакций (операций CUD). Классы запросов определяют такие методы, какGetPByRole
, и используют единицу работы и репозитории под ними: например, bit.ly/gAoDnO 09.03.2011