使用asp.net 4虽然是C#。
在我的数据访问层中,我有保存和更新记录的方法。保存很容易,但更新很乏味。
我之前使用的SubSonic很棒,因为它有活动记录,并且知道如果我加载了一条记录,更改了一些条目然后再次保存,它就会认为它是一个更新并且没有尝试保存新条目在DB。
我不知道如何在LINQ中做同样的事情。因此,我的工作流程如下:
如果我只保存'记录A',我最终会在数据库中输入一个新条目。
显然,通过记录A并执行以下操作会更好:
RecordA.Update();
我认为我在这里缺少一些东西,但我无法在网上找到直截了当的答案。
答案 0 :(得分:2)
您可以使用Table
实例上的Attach
method完成所需内容,并通过SubmitChanges()
上的DataContext
方法提交。
此过程可能不像我们希望的那样直截了当,但您可以阅读David DeWinter的LINQ to SQL: Updating Entities以获得更深入的解释/教程。
答案 1 :(得分:2)
假设你有一个产品类OR DB,那么你必须这样做。
DbContext _db = new DbContext();
var _product = ( from p in _db.Products
where p.Id == 1 // suppose you getting the first product
select p).First(); // this will fetch the first record.
_product.ProductName = "New Product";
_db.SaveChanges();
// this is for EF LINQ to Objects
_db.Entry(_product).State = EntityState.Modified;
_db.SaveChanges();
-------------------------------------------------------------------------------------
this is another example using Attach
-------------------------------------------------------------------------------------
public static void Update(IEnumerable<Sample> samples , DataClassesDataContext db)
{
db.Samples.AttachAll(samples);
db.Refresh(RefreshMode.KeepCurrentValues, samples)
db.SubmitChanges();
}
如果您将实体附加到上下文然后刷新(选择了KeepCurrentValues),Linq to SQL将从服务器获取这些实体,比较它们,并标记更新的那些不同的实体
答案 2 :(得分:1)
当LINQ-to-SQL更新数据库中的记录时,它需要确切地知道哪些字段已更改,以便仅更新这些字段。你基本上有三个选择:
SubmitChanges()
。任何分配了现有值的属性都不会更新。Attach
。我通常使用第一个选项,因为它最简单。两个数据库调用会导致性能下降,但除非您进行大量更新,否则无关紧要。