Linq 2 SQL - 经验心得-常见问题 (三)

对象是否能在不同的Linq2SQL的Context中混用

先看段代码

private static void ErrorCannotAttachAddNonNewEntities()
        {
            Purchase purchase;
            using (NutShellDataContext db = new NutShellDataContext())
            {
                db.Log = Console.Out;
                var query = from p in db.Purchases
                            where p.ID == 1
                            select p;

                purchase = query.First() as Purchase;
                
            }

            try
            {
                using (NutShellDataContext db2 = new NutShellDataContext())
                {
                   
                    purchase.Description = "Bike1";
                    //System.NotSupportedException will be raised
                    //An attempt has been made to Attach or Add an entity that is not new, perhaps having been loaded from another DataContext.  This is not supported.
                    //System.Data.Linq.ChangeTracker+StandardChangeTracker.Track(MetaType, Object, Dictionary[ObjectObject], Boolean, Int32)
                    db2.Purchases.Attach(purchase);
                    db2.SubmitChanges();
                }
            }
            catch
            {
                Console.WriteLine("Exception is occured");
                Console.ReadLine();
            }

            Console.WriteLine("Update Successfully");
            Console.WriteLine(purchase.Description);
            Console.ReadLine();
        }

可以看出来Purchase先取出来,范围是Context DB, 然后在DB2中试图修改。

System.NotSupportedException is thrown,An attempt has been made to Attach or Add an entity that is not new, perhaps having been loaded from another DataContext

exception是在方法System.Data.Linq.ChangeTracker+StandardChangeTracker.Track(MetaType, Object, Dictionary[ObjectObject], Boolean, Int32)中抛出的。

用reflect观察这个方法后发现,微软判断了,对象有没有延迟加载的对象。

我的通俗理解是,当对象有外键时,他的关系是维护在前一个context的,但是你把这个对象企图用到其他context,会造成意料不到的结果。所以不允许这么做。

如果没有外键的对象,其实是可以跨context去操作的。

这种案例做常见在web service的调用中,取的时候和当客户端修改完以后提交服务器进行修改的时候,datacontext是不一样的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值