繁体   English   中英

流利的NHibernate:插入或更新时忽略映射属性“ Length”

[英]Fluent NHibernate: mapping property “Length” ignored when inserting or updating

我们正在尝试(缓慢地)将所有程序从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)字段。

这是我的单元测试(休眠会话本身由我们正在设计的包装器类型封装,所以您不要怀疑):

  [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:错误[22001] [IBM] CLI0109E Zeichenfolge重新安装。” (德语为“字符串右截断”)。 分配长度小于或等于20个字符的字符串值不会导致异常。

那我想念的是什么? Length属性似乎没有任何功能上的影响。 我以为调用“ Length(20)”将导致ORM在保存时将字符串缩减为20个字符(就像Borlands Delphi在设置数据集中的字段分量的大小时所做的那样)。 : - /

任何提示都欢迎!

亲切的问候

安德烈亚斯

您的假设是不正确的。 NHibernate不会为您截断该字符串,无论如何这都不是一个好主意,因为您正在悄悄地丢失数据。

在映射中设置“长度”将仅设置数据库字段的长度。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM