2

FNHを使用して、ASP.NETMVC3アプリケーションで使用されるライブラリの約30クラスのマッピングを生成しています。私はMSSQLExpress10に取り組んでいます。開発目的でデータベースにデータを入力できるようにするコードを作成しました。ただし、Accountインスタンスを保存しようとすると、次のエラーメッセージが表示されます。

System.Data.SqlTypes.SqlTypeException:SqlDateTimeオーバーフロー。1/1/175312:00:00AMから12/31/999911:59:59PMの間にある必要があります。

これは、DateTimeであるAccount.CreationDate属性が原因で発生します。私は周りを見回しましたが、MSSQLと.NETのDateTimeは実際には同じではありません。FNHマッピングを介して、列を「datetime2」にするように強制しましたが、それは役に立たなかったようです。

これは私のアカウントクラスです(簡略化):

public class Account
{
    public virtual int Id { get; set; }
    public virtual string Comment { get; set;}
    public virtual DateTime CreationDate { get; set;}
    public virtual string Email { get; set;}
    public virtual string Password {get ; set;}
    public virtual string Locale {get; set;}

    public Account(string password, string email)
    {
        this.Email = email;
        SetNewPassord(password);
        this.CreationDate = DateTime.Now;
        this.Locale = "en-US";
    }
}

そしてFNHマッピング:

public class AccountMap : ClassMap<Account>
{
    public AccountMap()
    {
        Id(x => x.Id);
        Map(x => x.Comment);
        Map(x => x.CreationDate);
        Map(x => x.Email);
        Map(x => x.Password);
        Map(x => x.Locale);
    }
}

そして私がこれを呼ぶコード:

        var compteAdmin = new Account("test", "noone@nowhere.com");
        compteAdmin.Locale = "fr-FR";
        var toto = compteAdmin.CreationDate;
        try
        {
            session.Save(compteAdmin);
        }
        catch (Exception ex)
        {
            throw new ConfigurationException("Account.CreationDate: " + compteAdmin.CreationDate.ToString() + " ; Exception: " + ex);
        }

デバッグの目的で、いくつかの例外をスローしていることに注意してください。その出力は一種のシュールです!

Account.Creation date:2/6/2013 5:32:29 PM; 例外:System.Data.SqlTypes.SqlTypeException:SqlDateTimeオーバーフロー。1/1/175312:00:00AMから12/31/999911:59:59PMの間にある必要があります。

4

1 に答える 1

5

問題は、DateTime属性が「nullable」に設定されていなかったため、このプロパティを「Null」に設定する代わりに、常に01/01/0001に設定されていたため、範囲外エラーが発生したことです。

そのため、クラス(つまり:)とpublic virtual DateTime? CreationDate { get; set;}マッピング(Map(x => x.CreationDate).Nullable;)で属性をNullableに設定する必要があります。

これに失敗すると、属性をに設定しても、null01/01/0001と表示されます。属性がnull許容になると、その値は実際にはnullになり、クエリは成功します。

于 2013-02-08T09:03:40.223 に答える