简体   繁体   English

C#上的Nhibernate Fluent,无法对具有datetime的实体执行查询

[英]Nhibernate Fluent on C#, could not execute query for entity with datetime

I've a strange problem with Fluent Nhibernate on C#. 我在C#上使用Fluent Nhibernate遇到了一个奇怪的问题。 Here you can see my entity, my map, and my repository. 在这里,您可以看到我的实体,我的地图和我的存储库。 The problem is when i try to get a entity from the db. 问题是当我尝试从数据库获取实体时。 if I use only CODE_B or CODE_C the query will fail with "Could not load entity", but if I use CODE_A before CODE_B or CODE_C everything is working fine. 如果仅使用CODE_B或CODE_C,查询将失败,并显示“无法加载实体”,但是如果我在CODE_B或CODE_C之前使用CODE_A,则一切正常。 If I delete : 如果我删除:

Map(x => x.MODI_DAT);
Map(x => x.MODI_ORA);

all is working fine. 一切都很好。
I've tried to use these fields with string, datetime and to force customSqlType "datetime" but no one is working. 我试图将这些字段与字符串,日期时间一起使用,并强制customSqlType“ datetime”,但是没有人在工作。 I don't understand why if I get all entities from table the query for id is working, but if i don't ask before all the list i get an error. 我不明白为什么我要从表中获取所有实体,但对id的查询仍在工作,但是如果我在所有列表之前都没有询问,则会收到错误消息。

The other strange thing is that when i get the error, exception shows me the query of the object one. 另一个奇怪的是,当我收到错误消息时,异常向我显示了对象的查询。 If I manually try the query on db I correctly get the result object. 如果我手动尝试对db的查询,则可以正确获取结果对象。

Repository: 仓库:

namespace WebApplication.Providers
{
    public class TTW_SA_DETRepository
    {

        public TTW_SA_DET get() {
            //var all = session.QueryOver<TTW_SA_DET>().List();   CODE_A
            //var one = session.Get<TTW_SA_DET>( new TTW_SA_DET { 
CODI_SOC = "$$$", SAD_NOME_FORM = "ANAG_AZIONI", SAD_ORDE_COL = 0 });   CODE_B 
            var one = session.QueryOver<TTW_SA_DET>()
                .Where(x => x.CODI_SOC == "$$$")
                .And(x => x.SAD_NOME_FORM == "ANAG_AZIONI")
                .And(x => x.SAD_ORDE_COL == 0)
                .SingleOrDefault<TTW_SA_DET>();  // CODE_C
            return one;
        }



         protected NHibernate.ISessionFactory sessionFactory;
         protected NHibernate.ISession session;


         protected NHibernate.ISession openSession()
         {
              sessionFactory =          
    MicrosoftSQLConfNhibernate.CreateSessionFactory();
              session = sessionFactory.OpenSession();

              return session;
        }

        public TTW_SA_DETRepository()
        {
            openSession();
        }

    }

inside my main (Startup.cs): 在我的主目录(Startup.cs)中:

var rep = new TTW_SA_DETRepository();
rep.get();

Entity: 实体:

namespace WebApplication.Models
{
    public class TTW_SA_DET
    {
        virtual public string CODI_SOC { get; set; }
        virtual public string SAD_NOME_FORM { get; set; }
        virtual public int SAD_ORDE_COL { get; set; }
        virtual public DateTime MODI_DAT { get; set; }
        virtual public DateTime MODI_ORA { get; set; }

        public override bool Equals(object obj)
        {
            var val = obj as TTW_SA_DET;
            return val != null &&
                   CODI_SOC == val.CODI_SOC &&
                   SAD_NOME_FORM == val.SAD_NOME_FORM &&
                   SAD_ORDE_COL == val.SAD_ORDE_COL;                   
        }

        public override int GetHashCode()
        {
            var hashCode = 1411657508;
            hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(CODI_SOC);
            hashCode = hashCode * -1521134295 + EqualityComparer<string>.Default.GetHashCode(SAD_NOME_FORM);
            hashCode = hashCode * -1521134295 + EqualityComparer<int>.Default.GetHashCode(SAD_ORDE_COL);
            return hashCode;
        }

    }
}

EntityMap: EntityMap:

namespace WebApplication.Models
{
    public class TTW_SA_DETMap : ClassMap<TTW_SA_DET>
    {
        public TTW_SA_DETMap()
        {
            Table("TTW_SA_DET");
            CompositeId()
                .KeyProperty(x => x.CODI_SOC)
                .KeyProperty(x => x.SAD_NOME_FORM)
                .KeyProperty(x => x.SAD_ORDE_COL);
            Map(x => x.MODI_DAT);//.CustomSqlType("datetime");
            Map(x => x.MODI_ORA);//.CustomSqlType("datetime");
        }

    }
}

DB config: 数据库配置:

namespace WebApplication
{
    public class MicrosoftSQLConfNhibernate
    {


        public static ISessionFactory CreateSessionFactory()
        {
            return Fluently.Configure()
       .Database(MsSqlConfiguration.MsSql2012.ConnectionString(c => c
                .Server("myCORRECTdata")
                .Database("myCORRECTdata")
                .Username("myCORRECTdata")
                .Password("myCORRECTdata")
                ).ShowSql()
              )
              .Mappings(m =>
                m.FluentMappings.AddFromAssemblyOf<Startup>())
              .BuildSessionFactory();
        }

    }
}

Finally this is the table on MSSQL 2014: 最后,这是MSSQL 2014上的表:

CREATE TABLE EDILWEB_MONET.dbo.TTW_SA_DET (
    CODI_SOC varchar(3) NOT NULL,
    SAD_NOME_FORM varchar(50) NOT NULL,
    SAD_ORDE_COL int NOT NULL,
    MODI_DAT datetime,
    MODI_ORA datetime,
    CONSTRAINT PK_SY_SA_DET PRIMARY KEY (CODI_SOC,SAD_NOME_FORM,SAD_ORDE_COL)
) go

Probably is a network problem, with another gateway the code is working. 可能是网络问题,其他网关的代码正在运行。 Maybe the problem is a firewall somewhere or a MTU bad configuration. 可能问题出在某处的防火墙或MTU配置错误。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM