我目前在我的数据层中有一个长期存在的数据上下文,像这样:
public class DataRepository
{
private readonly NorthwindDatacontext db;
public DataRepository()
{
db = new NorthwindDatacontext();
}
public void insert(Order o)
{
db.Oreder.InsertOnSubmit(o);
db.SubmitChanges();
}
}
根据我的理解,更倾向于具有短暂的数据上下文但我不明白的是,当使用短时间数据上下文时,我如何处理下一个例子。
客户端执行以下操作的某个方法:
public void AddOrderDetails(IEnumrable<OrderDetails> od, Order o)
{
DataRepository repo = new DataRepository();
o.OrderDeatils.AddRange(od);
repo.Update(o);
}
现在我的数据存储库是这样的:
public class DataRepository
{
public Order GetOrder(int id)
{
using ( var db = New NorthwindDataContext() )
{
db.ObjectTrackingEnabled = false;
var order = db.Oreder.Where(o => o.id == id ).SingleOrDefault();
return order;
}
}
public void Update (Order o)
{
using ( var db = New NorthwindDataContext() )
{
db.Order.Attach(o,true);
db.SubmitChanges();
}
}
}
会更新关系吗?如果一些orderdetails是新的(还没有id),而另一些只是更新了呢?我该如何处理各种情况?
"Short - lived"并不意味着"只要方法被执行就存在"。它也可能意味着"上下文至少与存储库一样长"。
这似乎是大多数实现中首选的选项:
public class DataRepository()
{
private NorthwindContext _context;
public DataRepository( NorthwindContext context )
{
this._context = context;
}
public Order GetOrder( int id )
{
return this._context.....
}
注意,通过将上下文注入到存储库中,而不是为每个存储库创建上下文实例,您不仅可以在所有存储库方法中拥有相同的上下文,而且还可以在不同的存储库之间共享上下文的相同实例。