兴国安邦

C# 3.0, Linq, Linq To Sql

博客园 首页 新随笔 联系 订阅 管理
  33 Posts :: 0 Stories :: 530 Comments :: 52 Trackbacks

Linq To Sql 项目从Beta迁移到RTM要注意那些事项呢?RTM相对beta又做了那些变动呢?本文为你揭开这些问题。这里,我们只谈项目中经常碰到的,其他的略去不写。你若是有疑问,可以回贴问,我再帮你找。最后,放出修正文档。特别感谢伍迷TX的督促。

1,函数名称的改变
在添加,更新和删除实体对象时,本blog中的Linq To Sql进阶系列(三)CUD和Log 一文中所提及的,其函数名更改如下。

Beta 2 Name

RTM Name

Add

InsertOnSubmit

AddAll

InsertAllOnSubmit

Remove

DeleteOnSubmit

RemoveAll

DeleteAllOnSubmit

还有其他函数名称的改变,但是,好像本blog从来都没有提过,所以,不做太多说明。
We have also changed the members of ChangeSet to match these new names:

Beta 2 Name

RTM Name

AddedEntities

Inserts

RemovedEntities

Deletes

ModifiedEntities

Updates


2, dbml编码
以前是16,现在是8。因为这个也可能让你的程序编译不过。
<?xml version="1.0" encoding="utf-8"?>

3,一个叫DataSetExtensions的Assembly去掉
这个好像只在asp.net的程序里才会有这个问题,在你的web.config里,如果有这个问题,去掉这段。这个assembly早就没有了。
<add assembly="System.Data.DataSetExtensions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>

4, Attach函数的改变
Attach函数用来在不同的datacontext间,传递实体对象。现在这里做了更改。
The solution is add db.DeferredLoadingEnabled = false; to the code to void deferred loading in the first datacontext.

Customer c = null;

Using(DataContext db1 = new DataContext())

{

db1.DeferredLoadingEnabled = false;

c= db1.Customers.First();

}

Using(DataContext db2 = new DataContext())

{

db2.Customers.Attach(c);

….do something…

}


5,查询语法中不允许再显示构造实体对象
比如,在beta2中,你可以这么玩, 
  var q = from c in db.Customers
                    where Country 
== "USA"
                    select 
new Customer { Name = c.Name, City = c.City };
现在,这么玩就会在run-time时抛异常。这个地方的修改是因为一个bug 引起的。在beta2中,下面的代码

           var q 
= from c in db.Customers
                     select 
new Customer { City = c.City };


            
foreach (var item in q)
            
{
                Console.WriteLine(item.City);
            }
你得到的结果全是Aachen,虽然结果数目是对了,但是全是第一条纪录的值. 如果换做匿名类

           var q 
= from c in db.Customers
                     select 
new { City = c.City };


            
foreach (var item in q)
            
{
                Console.WriteLine(item.City);
            }

则结果又正确了。为了修复这个问题,在查询语句中,显示构造实体对象将抛异常。如果在查询语句中,显示构造的对象不是实体类的话,即没有table属性,那么又不会有异常。这里只所以会做这样的变动是考虑了更新的问题,如果,你显示构造实体对象时,不选主键,而你又要求更新,linq to sql怎么帮你做呢?我稍候提供的文档将解释的很详细,不多言。

6,delete时的改变
在beta2中,如果,你移除从某一表中移除一个实体对象,你须手动从该实体对象的EntitySets 移除实体,并遵从1:1的关系。(beta2被我卸了,我也不记得Dinesh Kulkarni说是什么情况了。)

7, vb中String = Nothing and String <> Nothing fixes
这个就是“随风流月”提到的bug,现在修复了。

8,OR Desinger的改变
首先,在beta2中,在手工编辑dbml产生的代码中,常丢失datacontext类的不带参数的构造函数,这个bug已经修复了。然后,dbml文件中也不再保存数据库的密码。

9,xml类型的映射
beta2中,影射为XDocuments,现在更改为XElement

其他的改变也有,但是好像和我们的关系不大了。如果,你还碰到了新的问题,可以拿出来,我们大家讨论。
更多参考Dinesh Kulkarni的文档 

 LINQ to SQL Beta 2 to RTM Breaking Changes

相关:
C# 3.0入门系列-目录导航
Linq To Sql进阶系列 -目录导航

posted on 2007-11-28 19:16 Tom Song 阅读(2677) 评论(17)  编辑 收藏 所属分类: C# 3.0Linq To Sql

Feedback

#1楼  2007-11-28 19:25 随风流月      
hehe
  回复  引用  查看    

#2楼  2007-11-28 19:43 Cheney Shue      
天啊,代码要全部重写了
  回复  引用  查看    

#3楼 [楼主] 2007-11-28 20:04 Tom Song      
@Cheney Shue
没有那么严重.不过做了改动是比较烦而已。只是些函数的名称变掉了。最严重的变动是第5个。这个影响的确比较大。
  回复  引用  查看    

#4楼  2007-11-28 20:06 菌哥      
怪不得从微软下的有些Labs在Beta2中编译不过去,原来如此
  回复  引用  查看    

#5楼  2007-11-28 20:19 木野狐(Neil Chen)      
我也发现了,但很多问题因为找不到文档只是猜测。还是在内部的消息灵通啊。
  回复  引用  查看    

#6楼  2007-11-28 20:21 木野狐(Neil Chen)      
天哪,这些也是我遇到了的问题:
===
2, dbml编码
以前是16,现在是8。因为这个也可能让你的程序编译不过。
<?xml version="1.0" encoding="utf-8"?>

3,一个叫DataSetExtensions的Assembly去掉
  回复  引用  查看    

#7楼  2007-11-28 20:21 Cheney Shue      
@Tom Song
对,就是第5条,不过那个bug我没碰到过。
  回复  引用  查看    

#8楼  2007-11-28 20:22 木野狐(Neil Chen)      
现在我还有问题,就是添加一个对象后, SubmitChanges(), 然后得到的 insert Id 始终是 0. 楼主是否能解答一下?
  回复  引用  查看    

#9楼  2007-11-29 10:11 木野狐(Neil Chen)      
错误 8, 9 我也都遇到了。幸好修正了
  回复  引用  查看    

#10楼  2007-11-29 10:40 Enzo      
谢谢 提供这个信息
  回复  引用  查看    

#11楼 [楼主] 2007-11-29 10:56 Tom Song      
@木野狐(Neil Chen)
你的主键是自动产生的么?如果是自动产生的,id应该是sql server产生的,和linq to sql无关。如果不是自动产生的,需要你指定id。你有重现步骤的么?
  回复  引用  查看    

#12楼  2007-11-29 11:39 FoolTime [未注册用户]
现在还是只支持sqlserver吗?
啥时候有关于oracle等其它数据库的支持啊。

  回复  引用    

#13楼  2007-11-29 11:48 伍迷      
终于看到这篇文档了,昨天因为由beta2换成RTM,一下子,我们的项目出现了N多的Error,修改起来够麻烦的,特别是第5条(不知这个bug算不算是我首先给博主提出的,还是微软早就知道的错误),让我整个代码都修订了一遍,伤筋动骨呀。

再次感谢博主的技术支持,否则后果真无法想象。
  回复  引用  查看    

#14楼 [楼主] 2007-11-29 14:03 Tom Song      
@伍迷
这个问题是这样的。最开始的设计时,就该是目前的这个样子。Dinesh Kulkarni在你提交问题给我之前,就log了一个bug。或许是dev大意,在beta2中,出现了这个bug,所以,这次的改动只是遵循了原来的设计。

还是很感谢大家给我提供的这些反馈。这里好几个bug就是从大家的反馈中得到的。比如,第5个的显示声明,第8个丢失构造函数的情况,都是大家的积极反馈。再次感谢。
  回复  引用  查看    

#15楼 [楼主] 2007-11-29 14:04 Tom Song      
@FoolTime
等Ado.Net的发布吧。估计就会支持了。
  回复  引用  查看    

#16楼  2007-12-05 10:19 dongjing      
helpful!
  回复  引用  查看    

#17楼  2007-12-23 23:35 a_a      
我就想知道怎样让LinqToSql像Beta2里面那样可以随便查询关系和更新数据,不知道有没有什么属性可以设回去?现在改的麻烦死了一点也不方便!
  回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-11-29 11:00 编辑过


相关链接: