c# - Entity Framework实体状态修改不做任何修改

标签 c# entity-framework

我在更新实体时遇到以下问题。下面给出的是我的 WCF 方法。 (update在判断是update还是add后调用public Save方法)

protected bool UpdateSalesMaster(SalesMaster order)
{
    using (var context = new MyContext())
    {
        SalesMaster original = context.SalesMasters.FirstOrDefault(o => o.OrderID == order.OrderID);

        if (original != null)
        {
            context.Entry(original).CurrentValues.SetValues(order);

            foreach (SalesDetail detail in order.SalesDetails)
            {
                if (detail.OrderDetailID == 0)
                    context.SalesDetails.Add(detail);
                else
                {
                    SalesDetails originalDetail = context.SalesDetails.FirstOrDefault(o => o.OrderDetailID == detail.OrderDetailID);
                    if (originalDetail != null)
                        context.Entry(originalDetail).CurrentValues.SetValues(detail);
                }
            }

            context.SaveChanges();
            return true;
        }
        else
        {
            throw new FaultException(string.Format("Invalid Order specified: {0}", order.OrderID));
        }
    }
}

当我只更新 SalesMaster 中的 OrderDate 并且不更改任何细节时,将向数据库触发更新查询以获取详细信息。我希望只看到 SalesMaster 的更新查询。

有人可以让我知道我在这里做错了什么吗?如果没有任何更改,我不想触发对数据库的更新查询。

我使用从数据库中获取原始值的方法来确定是否使用 context.Entry(originalDetail).CurrentValues.SetValues(detail) 更新了任何值;

我还通过检查实体的 IAuditable 实现来覆盖 SaveChanges 以设置 LastModified 日期。这是我发现详细信息实体的状态被标识为已修改的时候。但数据库中发生的唯一更新是 LastModifiedBy,它已在我的保存更改中更新。我不确定在没有详细更改的情况下如何将其设置为已修改状态。

public override int SaveChanges()
{
    var changeSet = ChangeTracker.Entries<IAuditable>();

    if (changeSet != null)
    {
        foreach (var entry in changeSet.Where(c => c.State != EntityState.Unchanged))
        {
            if (entry.State == EntityState.Added)
                entry.Entity.DateCreated = DateTime.Now;

            if (entry.State == EntityState.Modified)
            {
                entry.Property(a => a.CreatedByUser).IsModified = false;
                entry.Property(a => a.DateCreated).IsModified = false;
            }
            entry.Entity.DateModified = DateTime.Now;
        }
    }
    try
    {
        return base.SaveChanges();
    }
    catch (DbEntityValidationException ex)
    {
        throw ex;
    }

}

我的解决方案结构是:

  1. 客户端 - Windows 窗体用户界面
  2. 实体 - POCO 作为独立的库
  3. WCF - 所有业务逻辑,添加、更新、删除对象。
  4. 数据 - 具有 Fluent 映射的 Entity Framework 上下文。

最佳答案

根据您设置 POCO 的方式,EF 将默认使用两种方法之一来检查实体的更改。

如果您的所有 POCO 属性都是虚拟的,EF 将使用继承您的 POCO 类型的代理对象,并覆盖所有属性以跟踪更改。

我假设在这种情况下,对整个对象使用 SetValues 将触发脏标志,这将导致 EF 生成对数据库的更新查询。

如果您没有使用代理,您的 IAuditable 实现将成为 brumScouse 建议的主要嫌疑人。

关于c# - Entity Framework实体状态修改不做任何修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16265136/

相关文章:

c# - Entity Framework 0..1 到 0 的关系

c# - 以CSV格式导出到EXCEL时用逗号(,)分隔字符串c#

c# - SQL Server 在转换为 XML 时是否添加字节顺序标记?

c# - Entity Framework - 如何在辅助表中的非主键列上连接表?

NHibernate 与 Entity Framework 4.1 中的数据库支持

c# - 如何在控制台应用程序中为连接字符串定义数据目录以使用 Entity Framework 代码优先迁移

c# - EF : Include navigation property and exclude sub navigation property in same time

c# - 在给定文化的字符串中查找不区分大小写的第一个差异

c# - 如何访问 NSMutableArray 索引 Xamarin.ios

c# - 与在 Sql Server 上执行的 .NET 存储过程相关的开销是多少?