C#のFluent Nhibernateに奇妙な問題がありました。 エンティティ、マップ、およびリポジトリが表示されます。問題は、私がdbからエンティティを取得しようとするときです。 CODE_BまたはCODE_Cのみを使用すると、「エンティティを読み込めませんでした」というクエリが失敗しますが、CODE_BまたはCODE_Cの前にCODE_Aを使用するとすべて正常に動作します。 削除した場合:Nhibernate C#で流暢、datetimeでエンティティのクエリを実行できませんでした
Map(x => x.MODI_DAT);
Map(x => x.MODI_ORA);
すべて正常です。
私はこれらのフィールドをstring、datetimeと一緒に使用しようとしましたが、customSqlTypeを "datetime"に強制しましたが、誰も働いていませんでした。 なぜ私はテーブルからすべてのエンティティを取得するidのクエリが動作しているが、私はすべてのリストの前に私はエラーが表示されない場合は理解していない。
もう1つ奇妙なことは、エラーが出たときに例外が表示され、オブジェクト1のクエリが表示されます。私は手動でdbのクエリを試す場合、私は結果オブジェクトを正しく取得します。
リポジトリ:私のメインの内部
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();
}
}
(Startup.cs):
var rep = new TTW_SA_DETRepository();
rep.get();
エンティティ:
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:
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の設定:
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();
}
}
}
最後これは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