gpt4 book ai didi

c# - 使用 Linq 更新主表时更新子记录的有效方法

转载 作者:太空宇宙 更新时间:2023-11-03 14:00:33 26 4
gpt4 key购买 nike

我目前使用一个通用的存储库类,它只能像这样更新一个表

public abstract class MyRepository<T> : IRepository<T>
where T : class
{


protected IObjectSet<T> _objectSet;
protected ObjectContext _context;

public MyRepository(ObjectContext Context)
{
_objectSet = Context.CreateObjectSet<T>();
_context = Context;
}


public IQueryable<T> GetAll()
{
return _objectSet.AsQueryable();
}

public IQueryable<T> Find(Expression<Func<T, bool>> filter)
{
return _objectSet.Where(filter);
}

public void Add(T entity)
{
_objectSet.AddObject(entity);
_context.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Added);
_context.SaveChanges();
}

public void Update(T entity)
{
_context.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Modified);
_context.SaveChanges();
}

public void Delete(T entity)
{
_objectSet.Attach(entity);
_context.ObjectStateManager.ChangeObjectState(entity, System.Data.EntityState.Deleted);
_objectSet.DeleteObject(entity);
_context.SaveChanges();
}

}

对于我的 EDMX 设计器生成的每个表类,我创建另一个这样的类

public class CustomerRepo : MyRepository<Customer>
{
public CustomerRepo (ObjectContext context)
: base(context)
{

}
}

对于我需要对特定表进行的任何更新,我会这样做:

Customer CustomerObj = new Customer();
CustomerObj.Prop1 = ...
CustomerObj.Prop2 = ...
CustomerObj.Prop3 = ...
CustomerRepo.Update(CustomerObj);

当我只更新名为 Customer 的特定表时,这非常有效。现在,如果我还需要更新另一个表的每一行,该表是名为 Orders 的 Customer 的子表,我需要对 MyRepository 类进行哪些更改。订单表将有多个客户记录和多个字段的记录,例如 Field1、Field2、Field3。

所以我的问题是:1.) 如果我只需要根据条件更新订单表的某些行的 Field1,并根据不同的条件更新其他一些行的 Field2,那么我需要做哪些更改?

2.) 如果不存在这样的条件,并且所有子行都需要更新为所有行的相同值,那么我需要做哪些更改?

感谢您抽出宝贵时间。期待您的意见...

最佳答案

您的主要问题是您试图更新断开连接的实体(即 var myCustomer = new Customer())而不将其附加到数据上下文。参见 this answer有关如何附加断开连接的实体的详细信息。对于您的情况,我认为这可能会变得复杂,因为不仅需要附加父实体,还需要附加所有子实体。

在您的情况下,我的建议是对首先从上下文中检索到的实体执行更新,因此已经附加到它。在这种情况下,这些实体将自己跟踪更改。您无需将实体附加到上下文或调用 _context.ObjectStateManager.ChangeObjectState。再一次,看看 the same answer I mentioned earlier有关对附加实体执行更新的示例。加载父对象后,您只需将任何更改应用到它及其子对象,然后在一切都说完之后调用上下文中的 SaveChanges 方法。

注意:默认情况下,EF 将延迟加载任何子关系(即子对象、集合等)。但是,在某些情况下,您可能希望在加载父对象的同时显式/急切地加载子对象,而不是延迟加载(您可以找到文档 here)。

关于c# - 使用 Linq 更新主表时更新子记录的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10832680/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com