2017-05-04 49 views
0

我有一个包含多个表的postgres数据库。该项目使用实体框架实施。修改对象而不影响实体框架中的基本数据库表?

我有3个数据库类可以说A,B & C.类A包含B的对象列表。类B包含C的对象列表。 C类是一个包含一些字段的简单类。

初这些类的看起来像这样:

[Table("A")] 
public class A: GUIDModelBase 
{.... 
} 

数据被填充,如下:

Parent1 [A] 
    -Child1 [B] 
     --Grandchild1 [C] 
     --Grandchild2 [C] 
    -Child2 [B] 
     --Grandchild3 [C] 
     --Grandchild4 [C] 

对于一些特殊的要求, 我检索表的数据转换成对象A,使用API如下:

A AObj = commonDbService.ARepository.GetAById(A.Id); 

GetAById是使用dbse T作为如下:

protected DbSet<TEntity> dbset = null; 
public Project GetAById(Guid id) 
{ 
    return dbset.Include(x => x.CoordinateSystem) 
     .SingleOrDefault(p => p.Id == id); 
} 

我想操纵(不想有Grandchild2和Grandchild4),并在另一个类对象AObj的数据存储如下:

MigrationData md = new MigrationData(); 
md.ANewObj = Manipulate(AObj); //Removes two grandchildren elements 

当我这样做,甚至AObj也完全修改。我需要完整的数据完整的AObj和数据库表(但暂时直到我的应用程序重新启动)。表格数据显示在其中一个UI页面中。只要其修改如上面的行,UI页面只显示剩下的两个孙子。但是,如果我重新启动我的应用程序,所有的孙辈都存在于数据库中。

因此,我无法单独修改它,而无需修改基础数据库表。 任何人都可以帮助我做到这一点?

+0

可能的重复[如何分离实体框架代码中的对象优先?](http://stackoverflow.com/questions/5599147/how-do-i-detach-objects-in-entity-framework-code-第一个) – Gusman

+0

@Gusman:我试着按照两种方式来分离父母对象,就像你在上面分享的链接一样。但是,只要我分离或AsNoTracking,所有的子对象都被完全删除。只有父母及其领域完好无缺,儿童数量趋于零。我希望所有数据在对象中保持完整,并进一步更改此对象以不影响数据库。看起来我更接近解决方案,但无法让它工作。你可以让我知道更多关于如何做到这一点?谢谢。 – vinmm

+0

您是否在查询中包含子元素?如果默认情况下不包含它们,EF将执行延迟加载,并且当对象被分离时,不可能使用它。我想如果你明确地说明包括他们将被保留的子元素。否则,尝试首先分离子元素,然后分离根对象。 – Gusman

回答

1

简短的回答是,它取决于对象的操作实际上做了什么。如果你在修改对象时修改对象,那么是的,实体框架将会看到对象被修改,并且如果你调用SaveChanges会更新它。分离要分离的对象,以便可以自由处理它们,或者不要更改它们,而是将它们映射/克隆为新对象。

+0

正如我上面提到的那样,操作涉及从父列表中剥离几个对象,例如删除grandchild2和grandchild4。我尝试使用detach。一旦我呼叫分离该对象,其所有子项目和孙项目已被剥离。只保留父母的字段和值。如何在拥有父对象内的所有数据时分离和使用?请告诉我。 – vinmm

+0

正确的是,当仅分离父实体时,子代不会自动分离。我还建议使用AsNoTracking,而且我对你说它不起作用感到困惑。它的行为应与普通版本相同,除非您在上一个查询的上下文中有子对象。 EF会自动修复关系,所以也许会发生这种情况。做查询AsNoTracking包括所有的儿童实体,我认为它会没事的。 –

+0

刚刚意识到,子对象中的父对象和孙对象中的子对象列表还有一些更多的嵌套对象列表,还有一些更多的grandgrandchild类列表。每次都会很难单独分离一切。 :'(。不要认为我的问题有任何解决方法 – vinmm