LINQ跟踪更改

时间:2010-11-20 02:19:04

标签: c# linq

HI, Wit linq我在DAL中填充了一个通用列表。然后在UI层中,用户从列表中删除和更新项目。 LINQ是否有可能跟踪更改,而无需编写代码来检查哪些项目已被删除并删除它们/添加新项目和更新其他项目等。当使用datacontext时,这似乎无法实现,这会导致列表和单独的datacontext,负责SubmitChanges。任何帮助表示赞赏。

感谢 尼尔

3 个答案:

答案 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} })。当然,它需要知道每次更改 - 否则它将不知道更改数据库。