Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.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# 为什么不是';是否从数据库中删除NHibernate?_C#_Sql_Nhibernate_Fluent Nhibernate - Fatal编程技术网

C# 为什么不是';是否从数据库中删除NHibernate?

C# 为什么不是';是否从数据库中删除NHibernate?,c#,sql,nhibernate,fluent-nhibernate,C#,Sql,Nhibernate,Fluent Nhibernate,我对NHibernate没有从数据库中删除行有问题。Nhibernate正在保存并更新到同一数据库,没有问题 在运行SQL profiler之后,似乎没有将删除SQL发送到数据库-这让我认为这是配置问题,但对我来说没有什么突出的 配置 Nhibernate版本:3.3.1.4000 FluentNHibernate版本:1.3.0.733 SQL Server版本:2008R2 <?xml version="1.0" encoding="utf-8" ?> <hibernate

我对NHibernate没有从数据库中删除行有问题。Nhibernate正在保存并更新到同一数据库,没有问题

在运行SQL profiler之后,似乎没有将删除SQL发送到数据库-这让我认为这是配置问题,但对我来说没有什么突出的

配置

Nhibernate版本:3.3.1.4000 FluentNHibernate版本:1.3.0.733 SQL Server版本:2008R2

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>
    <property name="connection.connection_string_name">IntermediateDatabase</property>
    <property name="dialect">NHibernate.Dialect.MsSql2012Dialect</property>
    <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
    <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
    <property name="show_sql">true</property>
    <property name="connection.release_mode">auto</property>
    <property name="adonet.batch_size">500</property>

    <!-- Mapping assemblies -->
    <!-- Can't map it for Fluent NHibernate here; instead, load the mapping assembly in Global.asax.cs.
        If you're still using HBMs, you can use the mapping here or pass the assembly via Global.asax.cs
        as well, just like you can do with the Fluent NHibernate assembly(s). -->

  </session-factory>
</hibernate-configuration>

中间代谢酶
NHibernate.dial.MsSql2012Dialect
NHibernate.Connection.DriverConnectionProvider
NHibernate.Driver.SqlClientDriver
真的
汽车
500

谢谢

如果删除的对象是另一个对象集合的一部分,则在映射中give.Cascade.AllDeleteOrphan()并从集合中删除该项,然后nhibernate将根据您的注释中的信息向DB发送delete语句。

。。。看来你的工作方法是这样的:

更新

public T SaveOrUpdate(T entity) 
{ 
    using (Session) 
    { 
        using (TransactionScope scope = new TransactionScope())
        { 
            Session.SaveOrUpdate(entity); scope.Complete(); 
        } 
        return entity; 
    } 
}
这是绝对正确的。。。因为您的会话刷新模式很可能是:

session.FlushMode = FlushMode.Commit;
请在此处查看更多详细信息:

删除

但是可怜的妹妹
Delete()
并没有像强大的Update()那样得到完全支持

因此,即使对于
Delete()
会话
FlushMode
仍挂接在事务上提交。。。没有交易。这无疑(很可能)是真正的原因(正如怀疑的那样)


总结,将更新和删除这两项都视为双胞胎。。。并给予他们同样的关注-即事务

据我所知,没有办法,如何配置NHibernate以插入和更新,但从不删除。我敢打赌,这个问题与应用程序级别有关。最让我吃惊的是,删除操作没有包装在事务中,或者它没有调用会话。Flus()。。。你能出示你的删除代码吗?并解释它是如何包装在事务中的?或者检查您是否没有
mutable=false
,但如果您可以更新行,那么我不怀疑…您还可以提供映射吗?您确认数据已删除吗?可能探查器没有显示代码,因为您正在通过批大小进行批更新。在提交trxHey@RadimKöhler之后,只需检查删除是否发生。从外观上看,删除没有包装在transactionScope中:public void delete(T entity){using(Session){this.Session.delete(entity);}}}这可能是问题所在吗?更新是:public T SaveOrUpdate(T entity){using(Session){using(TransactionScope=newtransactionscope()){Session.SaveOrUpdate(entity);scope.Complete();}return entity;}谢谢,但这是一个单独的对象,不是集合的一部分。您在映射中定义了id参数吗?谢谢Radim-您锁定了它:)
public void Delete(T entity) 
{ 
    using (Session) 
    { 
        this.Session.Delete(entity); 
    } 
 }