すべてのプログラムを Delphi から C# に (ゆっくりと) 移行しようとしていますが、ORM を使用するのはこれが初めてです。;-)
私たちは使用しています:
- DB2 バージョン 9.7.5
- FluentNHibernate バージョン 1.3.0.0
- NHibernate バージョン 3.3.1.4000
単体テスト プロジェクトでは、エンティティ "TestCSharp" を定義しました。この型には、「TextVar」という名前の文字列プロパティがあります。マッピングは次のとおりです。
public class TestCsharpMapping:ClassMap<TestCsharp>
{
/// <summary>
/// map constructor
/// </summary>
public TestCsharpMapping()
{
Schema("TEST");
Table("TEST_CSHARP");
base.Id(x => x.Id).Column("ID").GeneratedBy.Sequence("ID_SEQUENCE");
Map(x => x.TextVar).Column("TEXT_VAR").Nullable().Length(20);
}
}
テーブル TEST.TEST_CSHARP は Linux DB2 データベースにあり、フィールド TEXT_VAR は VARCHAR(20) フィールドです。
これは私の単体テストです (hibernate セッション自体は、私たちが設計しているラッパー タイプによってカプセル化されているので、気にしないでください):
[TestMethod]
public void TestEditTextFields()
{
ReInitSession();
CleanUp();
var testobjects = _dataProviderSession.LoadAll<TestCsharp>(QueryDuration.ShortQuery);
testobjects.Add( new TestCsharp());
// overflow : Text_Var is only 20 chars long
testobjects[0].TextVar = "01234567890123456789A";
_dataProviderSession.Save();
testobjects = _dataProviderSession.LoadAll<TestCsharp>(QueryDuration.ShortQuery);
Assert.AreEqual(1, testobjects.Count);
Assert.AreEqual("01234567890123456789", testobjects[0].TextVar);
}
Save() コマンドで単体テストが失敗し、DB2 エラー「IBM.Data.DB2.DB2Exception: ERROR [22001] [IBM] CLI0109E Zeichenfolge rechts abgeschnitten.」が表示されます。(これはドイツ語で「文字列の右側が切り捨てられた」という意味です)。長さが 20 文字以下の文字列値を割り当てても、例外はありません。
それで、私が見逃しているのは何ですか?Length プロパティには、機能的な影響はないようです。「Length(20)」を呼び出すと、保存時に ORM が文字列を 20 文字に削減すると想定していました (データセット内のフィールド コンポーネントのサイズを設定するときに Borlands Delphi が行ったように)。:-/
どんなヒントでも大歓迎です!
敬具
アンドレアス