Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Fluent NHibernate:映射属性“;“长度”;插入或更新时忽略_C#_Nhibernate_Mapping_Db2_Fluent - Fatal编程技术网

C# Fluent NHibernate:映射属性“;“长度”;插入或更新时忽略

C# Fluent NHibernate:映射属性“;“长度”;插入或更新时忽略,c#,nhibernate,mapping,db2,fluent,C#,Nhibernate,Mapping,Db2,Fluent,我们正在尝试(缓慢地)将所有程序从Delphi迁移到C#,这是我们第一次使用ORM,因此如果这个问题可能很愚蠢,请原谅。;-) 我们正在使用: DB2版本9.7.5 FluentNHibernate版本1.3.0.0 NHibernate版本3.3.1.4000 对于我们的单元测试项目,我定义了实体“TestCSharp”。此类型有一个名为“TextVar”的字符串属性。以下是映射: public class TestCsharpMapping:ClassMap<TestCsharp&

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

}
公共类TestCsharpMapping:ClassMap
{
///  
///映射构造函数
/// 
公共TestCsharpMapping()
{
模式(“测试”);
表(“测试_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()
{
重新回归();
清理();
var testobjects=_dataProviderSession.LoadAll(QueryDuration.ShortQuery);
添加(新的TestCsharp());
//溢出:Text_Var只有20个字符长
testobjects[0].TextVar=“01234567890123456789A”;
_dataProviderSession.Save();
testobjects=\u dataProviderSession.LoadAll(QueryDuration.ShortQuery);
AreEqual(1,testobjects.Count);
AreEqual(“01234567890123456789”,testobjects[0].TextVar);
}
单元测试在Save()命令处失败,出现DB2错误“IBM.Data.DB2.DB2Exception:error[22001][IBM]CLI0109E Zeichenfolge rechts abgeschniten.”(德语中表示“字符串右截断”)。分配长度小于或等于20个字符的字符串值不会导致异常

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

欢迎任何提示

问候


安德烈亚斯你的假设是错误的。NHibernate不会为您截断字符串,这似乎不是一个好主意,因为您正在默默地丢失数据


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

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


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

谢谢您提供的信息!所以长度只是映射程序不使用的任意数据,是吗?如果我想生成关于映射信息的数据库,那么我就需要这个案例?那么,什么是最佳实践呢?我可以用属性设置器方法将所有字符串缩减到最大长度,这样用户就可以清楚地看到,他不能再写更多的字符了……它被使用了,但不是为了这个。我不相信“最佳实践”,但我认为你把最终用户和开发者混淆了。对于最终用户来说,一个好的用户体验就是限制输入字段的大小。这正是我所说的“减少属性设置器方法的内部开销”的意思。我的数据模型实体的属性最多需要20个字符,而且由于存在wpf数据绑定(通过视图模型对象),最终用户可以直接了解这一点。再次感谢。谢谢你的信息!所以长度只是映射程序不使用的任意数据,是吗?如果我想生成关于映射信息的数据库,那么我就需要这个案例?那么,什么是最佳实践呢?我可以用属性设置器方法将所有字符串缩减到最大长度,这样用户就可以清楚地看到,他不能再写更多的字符了……它被使用了,但不是为了这个。我不相信“最佳实践”,但我认为你把最终用户和开发者混淆了。对于最终用户来说,一个好的用户体验就是限制输入字段的大小。这正是我所说的“减少属性设置器方法的内部开销”的意思。我的数据模型实体的属性最多需要20个字符,而且由于存在wpf数据绑定(通过视图模型对象),最终用户可以直接了解这一点。再次感谢。
  [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);
  }