我有以下实体更新使用EF 4.3代码第一
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>
{ }
我添加了一个项目编号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对象时不会使用'Include'。我将在需要时使用显式加载,并最终要更新对象。
任何最佳建议?
谢谢@Ladislav 我不会有任何控制客户端如何更新我的对象。我已经创建了存储库,客户请求该项目。然后再次调用commit方法。 – Hitesh
由于这里有一个空间限制,我已经在下面详细回复了... – Hitesh