Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.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导出int/sbyte/字节长度_C#_Nhibernate_Fluent Nhibernate - Fatal编程技术网

C# 忽略Fluent NHibernate导出int/sbyte/字节长度

C# 忽略Fluent NHibernate导出int/sbyte/字节长度,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我正在用Fluent NHibernate做一个C#项目。为了简化操作,我使用添加的映射自动生成数据库。我得到了这个映射: Table("sometable"); LazyLoad(); Id(x => x.Id).Column("id").Length(11).GeneratedBy.Identity(); Map(x => x.Name).Column("name").Length(20).Not.Nullable(); Map(x => x.Count).Column("

我正在用Fluent NHibernate做一个C#项目。为了简化操作,我使用添加的映射自动生成数据库。我得到了这个映射:

Table("sometable");
LazyLoad();
Id(x => x.Id).Column("id").Length(11).GeneratedBy.Identity();
Map(x => x.Name).Column("name").Length(20).Not.Nullable();
Map(x => x.Count).Column("count").Length(2).Not.Nullable();
我得到了这个:

public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual sbyte Count { get; set; }
在我的实体课上。出口代码为:

.ExposeConfiguration(config =>
{
    new SchemaUpdate(config).Execute(false, true);
})
现在,
Name
的长度取得正确,但是,我的sbyte总是得到长度4,我的int总是长度11,无论我设置为
length(…)


为什么不占用我的长度?

sbyte
被映射到
DbType.sbyte
,它的实际大小(以DB为单位)取决于供应商(可能会消耗更多,而容量仍然只有1字节)。与
int
相同,映射到
DbType.Int32
,容量为4字节

这些类型不适合指定其大小,尝试设置其长度将被忽略。这不是NHibernate限制,而是这些类型的限制。一个字节就是一个字节,它的容量不能超过一个字节int的容量始终为4字节(即使运行x64)


可能是您错误地使用了
int
sbyte
而不是
decimal
,可以指定小数位数和精度(但不能指定其长度,具体取决于数据库供应商)。

不,我需要指定用户级别(如用户等级),我上面的代码只是一个示例。用户排名不能超过2个数字,所以我想我可以将长度设置为2。然后您需要的是
十进制(2,0)
(SQL Server语法)。两位数,没有小数部分。除了使用类似decimal的类型之外,没有解决方案可以仅通过不超过2位的业务约束类型在数据库中强制执行。如果要使用基于二进制的类型,如
int
sbyte
,则它们将仅限于其容量,这与以10为基数的数字无关。然后,您必须编写自己的代码来强制执行您的规则,无论是在您的应用程序中,还是作为数据库中的触发器,或者其他任何东西。所以-不要这么坏-您是说我几乎被迫使用十进制,否则这是不可能的?我想十进制是可以的,但在我的应用程序中它是128位(decimal=128位AFAIK),这就像。。嗯,比我实际需要的多得多。这本身不是很糟糕吗?你被迫什么都不做。做一些选择。您真的需要在数据库中将该字段限制为两位数吗?然后使用十进制(2,0)或在db中放入一些检查约束或触发器来引发错误。如果您实际上不需要这样一个强大的检查,只需保持简单,使用
int
(甚至不用麻烦使用
字节
,在大多数情况下,由于内存对齐,它不会比
int
便宜),然后让应用程序检查它是否保持在所需的范围内。关于.Net中的
十进制
内存大小对于两位数是否不好,这取决于应用程序。在大多数情况下,这不会产生任何可测量的影响。您的应用程序必须操纵大量此类“过大”变量,才能产生任何可测量的影响
decimal
对于某些计算来说也可能较慢,但这也仅适用于使用这些变量进行大量计算的应用程序。