Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Fluent Nhibernates在for循环中加载整个对象依赖项_C#_Nhibernate_Lazy Loading_Fluent - Fatal编程技术网

C# Fluent Nhibernates在for循环中加载整个对象依赖项

C# Fluent Nhibernates在for循环中加载整个对象依赖项,c#,nhibernate,lazy-loading,fluent,C#,Nhibernate,Lazy Loading,Fluent,我在一个使用NHibernate ORM的C项目中工作。我对这个框架很陌生 我有以下表格映射: this.Table("FCT_CONNECTR_TRANSF_MAP_CONCEP"); this.LazyLoad(); this.Id(x => x.Id).GeneratedBy.TriggerIdentity().Column("ID_CONNECTR_TRANSF_MAP_CONCEP"); this.References(x => x.ConnectorTransformat

我在一个使用NHibernate ORM的C项目中工作。我对这个框架很陌生

我有以下表格映射:

this.Table("FCT_CONNECTR_TRANSF_MAP_CONCEP");
this.LazyLoad();
this.Id(x => x.Id).GeneratedBy.TriggerIdentity().Column("ID_CONNECTR_TRANSF_MAP_CONCEP");
this.References(x => x.ConnectorTransformation).Not.Nullable().Column("ID_CONNECTOR_TRANSFORMATION");
this.References(x => x.LookUpConcept).Nullable().Column("ID_MAP_CONCEPT").Cascade.All();
this.References(x => x.MapCustomSource).Column("ID_MAP_CUSTOM_SOURCE").Cascade.All();
this.References(x => x.MapCustomTarget).Column("ID_MAP_CUSTOM_TARGET").Cascade.All();
this.References(x => x.CreatedBy).Nullable().Column("CREATED_BY");
this.References(x => x.ModifiedBy).Column("MODIFIED_BY");
this.Map(x => x.DtCreated).Nullable().Column("DT_CREATED");
this.Map(x => x.DtModified).Column("DT_MODIFIED");
this.Map(x => x.Description).Column("DSC_MAP_CONCEPT");
在我的C代码中,我有以下代码snipplet

foreach (var mapConcept in mapConcepts)
{
    this.connectorTransformationMapConceptEntityRepository.Delete(mapConcept);
}
在this.connectorTransformationMapConceptEntityRepository.DeletemapConcept行上;ORM加载所有依赖项+5000个select查询


我的问题:为什么NHibernate需要解析所有依赖项才能删除对象?

原因是级联,当您删除父对象时,所有子对象都将被删除,等等

如果不希望将删除级联,则可能需要将.Cascade.All更改为.Cascade.SaveUpdate

您可以在

找到有关级联行为的更多信息。有mapping.cascade.All应用于多对一引用映射。该级联设置指示NHibernate:加载相关数据并在删除时删除它们

这就是为什么NHibernate必须加载相关内容的原因。如果级联是我们需要的一项功能,我们可以使用一些优化、批量抓取:

NHibernate可以有效地利用批处理获取,也就是说,如果访问或收集一个代理,NHibernate可以加载多个未初始化的代理。批量抓取是对延迟选择抓取策略的优化。有两种方法可以优化批处理获取:在类和集合级别

类/实体的批量抓取更容易理解。假设您在运行时遇到以下情况:在ISession中加载了25个Cat实例,每个Cat都有一个对其所有者(一个人)的引用。Person类使用代理进行映射,lazy=true。如果您现在遍历所有cat并对每个cat调用cat.Owner,那么NHibernate将默认执行25条SELECT语句,以检索代理的所有者。您可以通过在人员映射中指定批次大小来调整此行为:

或者,我们甚至可以改变方法,使用更有效的方法,在不加载的情况下删除更多项目:

如前所述,自动透明的对象/关系映射涉及对象状态的管理。这意味着对象状态在内存中可用,因此使用SQL数据操作语言DML语句进行操作:直接在数据库中插入、更新、删除数据不会影响内存中的状态。但是,NHibernate提供了通过Hibernate查询语言HQL执行大容量SQL样式DML语句的方法

完全不加载的代码删除示例:

ISession session = sessionFactory.OpenSession();
ITransaction tx = session.BeginTransaction();

String hqlDelete = "delete Customer c where c.name = :oldName";
// or String hqlDelete = "delete Customer where name = :oldName";
int deletedEntities = s.CreateQuery( hqlDelete )
        .SetString( "oldName", oldName )
        .ExecuteUpdate();
tx.Commit();
session.Close();

谢谢你的回答。还有一个问题,如果我们有一个数据库可以管理这个,为什么我们要让NHibernate管理这个级联呢?好的观点。真正地视情况而定。简单的答案是:1级联是关于删除-应该总是发生-让它在DB上。它简单、可靠、有效、快速。。。2级联更为复杂。它是关于保存、更新、删除。。。这永远不会由DB管理。我们需要我们的代码,或者在NHibernate中使用非常强大和复杂的东西。在这样的场景中,我们在一个地方进行级联,用于数据库中未删除的所有操作。更易于维护和管理。。。希望这能多帮点忙;完美的非常感谢您的补充解释:。如果这对您有帮助,那就太好了,先生!享受强大的恩希伯内特;
Table(...)
Id(...)
BatchSize(25)
ISession session = sessionFactory.OpenSession();
ITransaction tx = session.BeginTransaction();

String hqlDelete = "delete Customer c where c.name = :oldName";
// or String hqlDelete = "delete Customer where name = :oldName";
int deletedEntities = s.CreateQuery( hqlDelete )
        .SetString( "oldName", oldName )
        .ExecuteUpdate();
tx.Commit();
session.Close();