1

Fluent NHibernate (1.3.0.727) の最新の NuGet パッケージを使用していますが、NHibernate 3.2 で修正されたと思われる問題がまだ発生しています (最新の Fluent は NHib 3.3 を使用しています)。データベースは Azure 上の SQL Server 2008 です。

.NET TimeSpanを sql Timeフィールドと比較するクエリを実行すると、次の例外がスローされます。

time と datetime のデータ型は、大なり演算子では互換性がありません。

サンプルクエリは次のとおりです。

TimeSpan ts = new TimeSpan(1, 0, 0);
List<Message> messages = messageRepo.FilterBy(m => m.SendTime > ts).ToList();

これが私のメッセージクラスのスニペットです:

public class Message
{
    public virtual int Id { get; set; }

    [DataType(DataType.Time)]
    public virtual TimeSpan? SendTime { get; set; }}
}

関連するマッピングの詳細は次のとおりです。

public class MessageMap : ClassMap<Message>
{
    public MessageMap()
    {
        Table("Message");
        LazyLoad();
        Id(x => x.Id).GeneratedBy.Identity().Column("MessageID");
        Map(x => x.SendTime).Column("SendTime").CustomType("TimeAsTimeSpan");
    }
}

私はあちこちを検索し、見つけたり考えたりできるすべてを試しました。多分私は明らかな何かを見逃していますか?助けてくれてありがとう。

4

2 に答える 2

3

Fluent の MsSql2008 構成により、NHibernate データベース ドライバーが TimeAsTimeSpan を適切に処理しないドライバーに設定されていることが判明しました。ドライバーを Sql2008ClientDriver に手動で設定すると、問題が解決します。以下の 4 行目を参照してください。

var rawConfig = Fluently.Configure()
    .Database(
        MsSqlConfiguration.MsSql2008.ConnectionString(x => x.FromConnectionStringWithKey("ConnectionString"))
            .Driver("NHibernate.Driver.Sql2008ClientDriver")
    )
    .Mappings(m => m.FluentMappings.AddFromAssemblyOf<SiteUserMap>())
    .BuildConfiguration();
于 2012-05-10T15:53:20.693 に答える
0

TimeSpan は数日保持できるため、Time ではなく DateTime と互換性があります。時刻には時刻のみが含まれます。したがって、プロパティに DataType 属性を使用しないでください。少なくとも DataType.Time は使用しないでください。

于 2012-05-04T21:13:01.920 に答える