运行完全没有任何效果,SQL Profiler无任何记录。Attach(T entity, T original) 1var ctx = new MyDataContext(); 2var newUser = new User(); 3newUser.UserId = new Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");//假设作为参数传进来的 4newUser.UserName = "New User Name"; 5var user = ctx.User.Where(u => u.UserId = newUser.UserId).Single(); 6ctx.Users.Attach(newUser, user); 7ctx.SubmitChanges();
运行时提示: Cannot add an entity with a key that is already in use. Attch(T entity, bool asmodified) 1var ctx = new MyDataContext(); 2var newUser = new User(); 3newUser.UserId = new Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");//假设作为参数传进来的 4newUser.UserName = "New User Name"; 5ctx.Users.Attach(newUser, true); 6ctx.SubmitChanges();
运行时提示:An entity can only be attached as modified without original state if it declares a version member or does not have an update check policy.
怎么办?提示中说"declares a version member ",通常来说是指SQL SERVER中TimeStamp类型的字段,在你所需要更新的表中加上一个字段,并标记为TimeStamp就可以了。但是这样做,对于我们来说仍然是个浪费,并且WHERE语句中仍然会出现TimeStamp的限制。
你还可以通过在字段上设置UpdateCheck.Never属性来避免更新检查,但是如果数据表更新、新增存储过程,需要重新生成dbml的话,你需要手动重新设置一遍。
Linq甚至没有一个类似Web引用中Update Web Reference的操作来让你方便的在数据表更新后更新dbml,并且在这个版本都不会提供,你所能做的只有删除原来的表,刷新Server Exploer,重新拖拽到dbml的设计视图中,或者,写个脚本,让SQLMETAL来帮你完成这些。
结论:
Linq虽然做为一个查询语言出现,但是在数据更新方面也是做了不少工作的,尤其是一些CHECK的工作,但对于写惯SQL的我们来说,还是很不习惯,甚至觉得,这些工作你不替我做才好呢。
在没有更好解决办法的前提下,在更新操作上,老老实实的写SQL语句或者存储过程应该是个不坏的选择。
(编辑:aniston)
|