文章来自:http://developer.51cto.com/art/200909/150713.htm
Linq SubmitChanges方法计算要插入、更新或删除的已修改对象的集,并执行相应命令以实现对数据库的更改。
无论对象做了多少项更改,都只是在更改内存中的副本。并未对数据库中的实际数据做任何更改。直到对DataContext显式Linq SubmitChanges,所做的更改才会传输到服务器。调用时,DataContext会设法将我们所做的更改转换为等效的SQL命令。我们也可以使用自己的自定义逻辑来重写这些操作,但提交顺序是由DataContext的一项称作“更改处理器”的服务来协调的。事件的顺序如下:
1. 当Linq SubmitChanges方法时,LINQ to SQL会检查已知对象的集合以确定新实例是否已附加到它们。如果已附加,这些新实例将添加到被跟踪对象的集合。
2. 所有具有挂起更改的对象将按照它们之间的依赖关系排序成一个对象序列。如果一个对象的更改依赖于其他对象,则这个对象将排在其依赖项之后。
3. 在即将传输任何实际更改时,LINQ to SQL会启动一个事务来封装由各条命令组成的系列。
4. 对对象的更改会逐个转换为SQL命令,然后发送到服务器。
如果数据库检测到任何错误,都会造成提交进程停止并引发异常。将回滚对数据库的所有更改,就像未进行过提交一样。DataContext 仍具有所有更改的完整记录。
下面代码说明的是在数据库中查询CustomerID为ALFKI的顾客,然后修改其公司名称,第一次更新并Linq SubmitChanges方法,第二次更新了数据但并未Linq调用SubmitChanges方法。
- //查询
-
Customer cust = db.Customers.First(c => c.CustomerID == "ALFKI");
- //更新数据并调用SubmitChanges()方法
-
cust.CompanyName = "YJingLee's Blog";
- db.SubmitChanges();
- //更新数据没有调用SubmitChanges()方法
-
cust.CompanyName = "http://lyj.cnblogs.com";
动态查询
使用动态查询,这个例子用CreateQuery()方法创建一个IQueryable类型表达式输出查询的语句。这里给个例子说明一下。有关动态查询具体内容,下一篇介绍。
- var c1 = Expression.Parameter(typeof(Customer), "c");
-
PropertyInfo City = typeof(Customer).GetProperty("City");
-
-
var pred = Expression.Lambda<Func<Customer, bool>>(
- Expression.Equal(
- Expression.Property(c1, City),
- Expression.Constant("Seattle")
- }
- };
-
IQueryable custs = db.Customers;
-
Expression expr = Expression.Call(typeof(Queryable), "Where",
- new Type[] { custs.ElementType }, custs.Expression, pred);
-
IQueryable<Customer> q = db.Customers.AsQueryable().
-
Provider.CreateQuery<Customer>(expr);
Log属性用于将SQL查询或命令打印到TextReader。此方法对了解 LINQ to SQL 功能和调试特定的问题可能很有用。
下面的示例使用Log属性在SQL代码执行前在控制台窗口中显示此代码。我们可以将此属性与查询、插入、更新和删除命令一起使用。
- //关闭日志功能
-
//db.Log = null;
- //使用日志功能:日志输出到控制台窗口
-
db.Log = Console.Out;
-
var q = from c in db.Customers
-
where c.City == "London"
- select c;
- //日志输出到文件
-
StreamWriter sw = new StreamWriter(Server.MapPath("log.txt"), true);
-
db.Log = sw;
-
var q = from c in db.Customers
-
where c.City == "London"
- select c;
- sw.Close();
分享到:
相关推荐
在LINQ to SQL中,我们可以使用InsertOnSubmit方法将新的对象添加到对应的集合中,然后调用SubmitChanges方法将数据提交到数据库。 例如,下面是一个简单的Insert操作示例: NorthwindDataContext db = new ...
- **更新数据**:直接修改对象属性后,再次调用SubmitChanges()即可更新数据库。 ```csharp myTable = result.First(); myTable.Name = "Updated Name"; db.SubmitChanges(); ``` - **删除数据**:使用...
4. **自动跟踪更改**:DataContext自动跟踪实体类的更改,当调用SubmitChanges()方法时,会将这些更改同步到数据库,简化了数据持久化的处理。 **学习资源** 对于想要深入学习LInq的朋友,"LInq入门宝典"提供了一...
- **修改(Update)**:首先查询出要修改的对象,修改其属性,然后调用SubmitChanges方法来更新数据库中的记录。 - **查询(Select)**:这是LINQ最常用的功能,可以通过多种方式(如lambda表达式、匿名类型、查询...
1. **增(Insert)**:创建一个新的实体对象,设置其属性,然后添加到DataContext的某个集合中,最后调用SubmitChanges()即可插入到数据库。 2. **删(Delete)**:找到要删除的对象,将其从DataContext的集合中...
例如,添加新对象到DataContext,修改现有对象,然后调用SubmitChanges()方法即可完成操作。 三、LINQ查询语法 1. 选择查询(Select):用于从数据源中选取指定的元素。例如,`from item in items select item.Name...
- **添加**:创建新的数据模型对象,将其添加到对应的`Table<T>`集合中,然后调用`SubmitChanges()`方法保存到数据库。 - **修改**:选取需要修改的对象,更改其属性,然后同样调用`SubmitChanges()`来更新数据库...
10. **改变跟踪**:DataContext能够跟踪实体的状态(未更改、已添加、已修改、已删除),并在调用SubmitChanges方法时自动发送适当的SQL命令以更新数据库。 通过学习和掌握C# LINQ to SQL,开发者可以更高效地处理...
3. 添加数据:创建一个新的Products实体实例,填充属性值,然后使用`InsertOnSubmit()`方法将其添加到数据上下文,最后调用`SubmitChanges()`提交更改。 4. 修改数据:根据ID获取要修改的实体,改变其属性值,然后...
总之,C#中的LINQ简化了与SQL数据库的交互,通过InsertOnSubmit和SubmitChanges方法,我们可以轻松地将数据添加到数据库中。理解这些概念和操作对于高效地进行数据库操作至关重要。在实际项目中,你可能还需要考虑...
- **避免在循环中调用SubmitChanges**:应尽量将多个更改合并到一个SubmitChanges调用中,减少与数据库的交互次数。 - **设计良好的数据库模式**:数据库模式的设计直接影响到LINQ to SQL的效率和易用性,良好的...
当在DataContext生命周期内对多个对象进行更改并调用SubmitChanges()时,这些更改将作为一个事务提交。如果任何更改失败,整个事务都将回滚,以保持数据的一致性。 例如: ```csharp using (var db = new ...
5. **更新(Update)操作**:当你需要更新一个已存在的实体时,首先通过ID或其他唯一标识找到该实体,修改其属性,然后调用SubmitChanges。 ```csharp var entity = (from e in db.YourEntities where e.Id == ...
- 更新数据:修改对象属性后调用`SubmitChanges()`。 - 删除数据:标记对象为删除状态,然后提交更改。 - 查询数据:利用LINQ的查询语法,实现灵活的查询需求。 **总结** 本资料集全面涵盖了LINQ的基本概念、...
8. **更改跟踪**:DataContext自动跟踪对象的更改,当调用SubmitChanges()方法时,会将这些更改持久化到数据库。 9. **扩展方法**:LINQ查询中广泛使用的许多方法,如Where()、Select()、GroupBy()等,都是通过C#的...
对于增(Insert)操作,当用户提交一条新的留言时,我们可以通过创建一个新的`GuestBookEntry`实例,设置其属性值,然后调用DataContext的`SubmitChanges()`方法将其保存到数据库。例如: ```csharp var newEntry =...
首先,我们需要包含必要的命名空间,如`System.Linq`和`System.Data.Linq`,它们提供了 LINQ to SQL 所需的类和方法。接下来,我们需要创建一个DataContext对象,它是LINQ to SQL与数据库交互的基础。DataContext会...
只需简单地操作对象属性,然后调用SubmitChanges()方法即可完成数据库的更新。 **三、LINQ to Entities** 1. **Entity Framework**:LINQ to Entities是基于ADO.NET Entity Framework的,它可以处理更复杂的ORM...
在LINQ to SQL或Entity Framework等ORM(对象关系映射)工具中,可以创建一个新的数据对象,设置其属性,然后添加到DataContext的集合中,最后调用SubmitChanges()方法保存更改: ```csharp var newCustomer = new ...