映射属性"Length"插入或更新时忽略

本文关键字:quot 更新 Length 属性 映射 插入 | 更新日期: 2023-09-27 18:15:27

我们正在尝试(慢慢地)将我们所有的程序从Delphi迁移到c#,这是我们第一次使用ORM,所以如果这个问题可能很愚蠢,请原谅。: -)

我们正在使用:

    DB2 Version 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. xml "。DB2Exception: ERROR [22001] [IBM] CLI0109E Zeichenfolge rechts abgeschnitten."(在德语中是"字符串右截断"的意思)。赋值长度小于或等于20个字符的字符串值不会导致异常。

那么我错过了什么呢?Length属性似乎没有任何功能上的影响。我假设调用"Length(20)"会导致ORM在保存时将字符串减少到20个字符(就像Borlands Delphi在设置数据集中字段组件的大小时所做的那样)。: -/

欢迎任何提示!

亲切的问候

Andreas

映射属性"Length"插入或更新时忽略

你的假设不正确。NHibernate不会为你截断字符串,这似乎不是一个好主意,因为你正在无声地丢失数据。

在映射中设置长度只会设置数据库字段的长度。