简体   繁体   English

流畅的NHibernate的Length属性不能用于更新

[英]Fluent NHibernate's Length property not working on update

I have the next mapping, where I specify the length of some string fields: 我有下一个映射,我指定一些字符串字段的长度:

public ResolutionMap()
{
  Schema("dbo");
  Table("Resolution");
  Id(x => x.IdResolution, "resolution_id").UnsavedValue(0).GeneratedBy.Identity();
  Component(x => x.Store, m =>
    {
      m.Map(y => y.StoreCodeId, "store_code_id");
      m.Map(y => y.StoreCode, "store_code").Length(10);
    }
  );
  Map(x => x.ResolutionData, "resolution_data").Length(42);
}

However, when I watch the update query executed at the SQL Server Profiler, I see that the length set on the mapping is not respected at all on the parameter declaration: 但是,当我在SQL Server Profiler上观察更新查询时,我发现在参数声明中根本没有考虑映射上设置的长度:

exec sp_executesql
  N'UPDATE dbo.Resolution SET resolution_data = @p0, store_code_id = @p1, store_code = @p2 WHERE resolution_id = @p3',
  N'@p0 nvarchar(4000),@p1 int,@p2 nvarchar(4000),@p3 int',
  @p0=N'Test',@p1=89,@p2=N'ST000003',@p3=275

Why could this be happening? 为什么会发生这种情况? I need to set the length because this slows the update process. 我需要设置长度,因为这会减慢更新过程。

I am currently using Fluent NHibernate 1.3.0.733 and NHibernate 3.3.1 over .NET Framework 3.5. 我目前在.NET Framework 3.5上使用Fluent NHibernate 1.3.0.733和NHibernate 3.3.1。

Apparently, Length(x) is only used if you are generating the database schema from the mappings. 显然,只有在从映射生成数据库模式时才使用Length(x)

NHibernate won't let you save a property to a column where truncation is involved, an exception will be raised. NHibernate不允许您将属性保存到涉及截断的列,将引发异常。

"String or binary data would be truncated. The statement has been terminated."

What are the underlying types of the strings? 字符串的基础类型是什么? Are the strings always the same length or do they vary? 字符串总是相同长度还是变化? varchar(x) for example. varchar(x)例如。

You can specify the lengths for example with: 您可以指定长度,例如:

Map(x => x.StoreCode).CustomSqlType("varchar (512)"); etc. 等等

Or can create a convention to set the default string length: 或者可以创建约定来设置默认字符串长度:

public class DefaultStringLengthConvention: IPropertyConvention
{
  public void Apply(IPropertyInstance instance)
  {
    instance.Length(250);
  }
}

For more information, see: 有关更多信息,请参阅:

Override for fluent NHibernate for long text strings nvarchar(MAX) not nvarchar(255) 为长文本字符串覆盖流畅的NHibernate nvarchar(MAX)不是nvarchar(255)

http://marcinobel.com/index.php/fluent-nhibernate-conventions-examples/ - StringColumnLengthConvention http://marcinobel.com/index.php/fluent-nhibernate-conventions-examples/ - StringColumnLengthConvention

https://github.com/jagregory/fluent-nhibernate/wiki/Auto-mapping https://github.com/jagregory/fluent-nhibernate/wiki/Auto-mapping

https://github.com/jagregory/fluent-nhibernate/wiki/Conventions https://github.com/jagregory/fluent-nhibernate/wiki/Conventions

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

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