【发布时间】:2012-05-02 12:28:47
【问题描述】:
我有以下实体
public class Item
{
public int Id { get; set; }
public string Name { get; set; }
public Sections Sections { get; set; }
}
public class Section
{
public int ID { get; set; }
public string Name { get; set; }
}
public class Sections : List<Section>, ICollection<Section>
{ }
我添加了一个项目 ID 为 1 的新项目,但其中没有任何部分...
现在我想修改项目并在其中添加新部分,为此,我在上下文中检索该项目并将其保存在另一个上下文中。在这里,我必须使用两个单独的上下文,因为不确定用户何时要更新对象。在那之前我不能让上下文对象保持打开状态。
Item fAp;
using (var ctx = new MyContext())
{
fAp = ctx.Items.Include(a => a.Sections).Single(a => a.Id == 1);
}
using (var ctx2 = new MyContext())
{
var nsec = new Section()
{
ID = 1,
Name = "App Sec...1"
};
fAp.Sections.Add(nsec);
ctx2.Entry(fAp).State = EntityState.Modified;
ctx2.SaveChanges();
}
通过这样做,新的部分没有被添加到数据库中。然后我修改了代码并在调用 ctx2.SaveChanges() 之前添加了以下行。
ctx2.Entry(nsec).State = EntityState.Added;
保存成功。
现在,我的问题是我有非常复杂的数据层次结构,我的意思是 Section 类也有很多子导航属性,这些属性还有很多,等等。
跟踪所有此类属性并手动设置它们的状态将非常困难。这种情况下如何更新数据?
还有一件事,我不会使用急切加载,我的意思是在检索 Item 对象时我不会使用“包含”。我将在需要时使用显式加载,最后想要更新对象。
有什么好的建议吗?
【问题讨论】:
标签: .net database entity-framework