使用LINQ to SQL的短期datacontext

时间:2015-05-24 12:23:24

标签: c# linq linq-to-sql

我目前在我的数据层中有一个长寿命的datacontext,如下所示:

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);
}

现在我的DataRepository就是这样:

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();
        }
    }
}

它会更新关系吗?如果一些OrderDeatils是新的(还没有ID),有些只是更新了。我应该如何处理所有情况?

1 个答案:

答案 0 :(得分:0)

“短暂生活”并不意味着“只要方法被执行就会存在”。它也可以表示“上下文至少与您的存储库一样长”。

这似乎是大多数实现中首选的选项:

public class DataRepository()
{
    private NorthwindContext _context;

    public DataRepository( NorthwindContext context )
    {
        this._context = context;
    }

    public Order GetOrder( int id )
    {
        return this._context.....
    }

请注意,通过将上下文注入存储库,而不是为每个存储库创建上下文实例,您不仅可以在所有存储库方法中使用相同的上下文,还可以共享上下文的相同实例不同的存储库。