HI, Wit linq我在DAL中填充了一个通用列表。然后在UI层中,用户从列表中删除和更新项目。 LINQ是否有可能跟踪更改,而无需编写代码来检查哪些项目已被删除并删除它们/添加新项目和更新其他项目等。当使用datacontext时,这似乎无法实现,这会导致列表和单独的datacontext,负责SubmitChanges。任何帮助表示赞赏。
感谢 尼尔
答案 0 :(得分:3)
如果您使用的是Linq.DataContext
,那么它确实会跟踪您的变化。
要引用的函数是System.Data.Linq.DataContext.GetChangeSet。虽然可以随时调用GetChangeSet
,但最好引用MSDN文档中的Remarks部分。
您可以在提交时检查/采取行动......
以下是一个快速示例,说明如何覆盖SubmitChanges
上的DataContext
并在此时采取措施。
该示例显示您可以在最终提交之前修改数据,还可以在特定成员更新时跟踪并采取特殊操作:
namespace ExampleProject1.Models
{
public partial class ExampleProject1DataContext
{
public override void SubmitChanges(ConflictMode failureMode)
{
ManangeAndProcessChangeSet(base.GetChangeSet());
base.SubmitChanges(failureMode);
}
private void ManangeAndProcessChangeSet(ChangeSet changeSet)
{
DateTime now = DateTime.UtcNow;
if (changeSet.Inserts.Count > 0)
{
ProcessInserts(changeSet.Inserts, now);
}
if (changeSet.Updates.Count > 0)
{
ProcessUpdates(changeSet.Updates, now);
}
if (changeSet.Deletes.Count > 0)
{
ProcessDeletes(changeSet.Deletes, now);
}
}
private void ProcessInserts(IList<object> list, DateTime now)
{
IEnumerable<Cake> cakes = list.OfType<Cake>();
IEnumerable<Topping> toppings = list.OfType<Topping>();
// Update the created and modified times.
foreach (Cake cake in cakes)
{
cake.Guid = Guid.NewGuid();
cake.CreatedDateTime = now;
cake.ModifiedDateTime = now;
}
foreach (Topping topping in toppings)
{
topping.Guid = Guid.NewGuid();
topping.CreatedDateTime = now;
topping.ModifiedDateTime = now;
}
}
private void ProcessUpdates(IList<object> list, DateTime now)
{
IEnumerable<Cake> cakes = list.OfType<Cake>();
IEnumerable<Topping> toppings = list.OfType<Topping>();
// Update the created and modified times.
foreach (Cake cake in cakes)
{
ProcessUpdates(cake, now);
}
foreach (Topping topping in toppings)
{
topping.ModifiedDateTime = now;
}
}
private void ProcessDeletes(IList<object> list, DateTime now)
{
IEnumerable<Cake> cakes = list.OfType<Cake>();
IEnumerable<Topping> toppings = list.OfType<Topping>();
// Could create tasks here to delete associated stored files for cakes and toppings.
}
private bool ProcessUpdates(Cake cake, DateTime now)
{
bool modified = false;
ModifiedMemberInfo[] mmi = context.Cakes.GetModifiedMembers(cake);
foreach (ModifiedMemberInfo mi in mmi)
{
switch (mi.Member.Name)
{
case "CountOfItemsSold":
// Exclude from updating the modified date.
break;
case "IsExpired":
if ((bool)mi.CurrentValue)
{
cake.ExpiredDateTime = now;
}
else
{
cake.ExpiredDateTime = null;
}
modified = true;
break;
default:
modified = true;
break;
}
}
if (modified)
{
cake.ModifiedDateTime = now;
}
return modified;
}
}
}
答案 1 :(得分:1)
如果你有N层应用程序,这是不可能的,因为你将以断开连接的方式进行更新,删除和插入。
换句话说,一个数据上下文将用于创建列表,实体将通过WCF或其他一些机制传递给客户端,然后发送回DAL,另一个数据上下文将用于执行更新。
答案 2 :(得分:0)
目前还不清楚您正在使用哪种编辑机制,但如果涉及多个DataContext
,则是:您必须告诉提交有关删除的数据上下文(通过{{3} })。当然,它需要知道每次更改 - 否则它将不知道更改数据库。