【问题标题】:Linq2Sql: re-Attaching entity to datacontext but not original datacontext problemLinq2Sql:将实体重新附加到数据上下文但不是原始数据上下文问题
【发布时间】:2009-09-04 14:09:00
【问题描述】:

谁能帮忙?我对 linq2sql 有疑问,并试图通过数据上下文附加(更新)实体类,它抱怨它不是原始上下文,这是真的(见下面的代码)......我认为打开数据上下文和不需要时关闭它?

我基本上让我的应用程序调用服务层,该服务层又调用数据库上下文所在的存储库......你可以在这里看到我有 2 个数据上下文,每个方法中都定义了一个数据上下文......

基本上发生的事情是我的应用程序“获取”预订......然后应用程序更新实体类“预订”,然后将其重新发送到“更新”预订......任何人都可以帮忙......我完全卡住了

这基本上是我的代码

    public bool UpdateReservation(Reservation reservation)
    {
        bool success = false;
        try
        {
            ResDataContext db = new ResDataContext ();

            db.Reservations.Attach(reservation);
            db.SubmitChanges();
            success = true;

        }
        catch (Exception ex)
        {
            Console.WriteLine("");

        }


        return success;

    }

    public Reservation GetReservation(string reservationNumber)
    {
        ResDataContext db = new ResDataContext ();

        return db.Reservations.Where(r => r.ReservationNumber == reservationNumber).SingleOrDefault(); 
    }

【问题讨论】:

    标签: c# sql-server linq-to-sql datacontext


    【解决方案1】:

    问题在于您没有重新附加到相同的数据上下文。

    您需要在调用之间保持 ResDataContext 处于活动状态。

    • 在包含 ResDataContext 的类上创建一个属性。
    • 在构造函数中实例化 ResDataContext
    • 如果您的呼叫通过 WCF,您将需要使用每个会话呼叫

    这是 Eniity 框架(不是 linq to SQL),但问题类似:

    Entity Framework: AttachAsModified failure / confusion :)

    【讨论】:

    • 但我认为保留对数据上下文的引用是一种不好的方式。我认为它是开放的数据上下文 - 使用它 - 并销毁它??
    • Shiraz,如果事实上我确实将我的数据上下文作为类级别变量保留在我的存储库中,那么我认为这将解决我去更新预订时的问题 - 数据上下文仍然存在..但我很想知道让数据上下文一直打开会有什么影响..
    【解决方案2】:

    您可以先从 DataContext 中收集正确的 Reservation 对象,然后更新并提交它。

    像这样:

     public bool UpdateReservation(Reservation reservation)
    {
        bool success = false;
        try
        {
            ResDataContext db = new ResDataContext ();
    
            Reservation res = db.Reservations.Where(r => r.ReservationNumber == reservation.ReservationNumber).Single();
            db.Reservations.InsertOnSubmit(res);
            db.SubmitChanges();
            success = true;
    
        }
        catch (Exception ex)
        {
            Console.WriteLine("");
    
        }
    
    
        return success;
    
    }
    

    【讨论】:

    • 谢谢 .. 是的,我明白了,但实际上我正在重新请求新数据上下文的对象,虽然完全可行......我不想回到数据库只是为了得到我已经拥有但在以前的 dataontext 上提出的新预订
    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多