Mat*_*nce 14 nhibernate fluent-nhibernate
是否有可能具有由数据库管理的类自动增量的整数属性,但不是主键(或NHibernate引用它们的ID)?我很难找到如何做到这一点的例子.任何帮助,将不胜感激.谢谢.
两种选择.
如果数据库100%对此负责,您只需告诉NHibernate该属性已生成,而不是将其包含在任何更新/ isnerts中.缺点是NH需要进行额外的选择以保持内存中的新鲜值.
<property name ="Foo"generated ="always"update ="false"insert ="false"/>
如果数据库不负责,并且您只想自动完成此操作,则可以使用拦截器在插入上将值设置为1并在更新时将其递增1.
http://www.nhforge.org/doc/nh/en/index.html#objectstate-interceptor(11.1 - 拦截器)
您将覆盖OnSave()以查找属性并设置初始值,然后重写OnFlushDirty()以查找属性属性和增量.
编辑:
我是个白痴,没注意到你说Fluent NHibernate.
编辑#2:
我想您可能也有兴趣将此列用作版本控制?
< version name="Foo" generated="always" />
Run Code Online (Sandbox Code Playgroud)
这对我有用:
public class Potato
{
public virtual Guid Id { get; protected set; }
public virtual int LegacyId { get; protected set; }
}
public class PotatoMap : ClassMap<Potato>
{
public PotatoMap()
{
Id(x => x.Id).GeneratedBy.GuidComb();
Map(x => x.LegacyId).CustomSqlType("INT IDENTITY(1,1)").Not.Nullable().ReadOnly().Generated.Insert();
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,整数设置为由数据库生成,并指示NHibernate在插入时检索它.
值得注意的是,映射只是答案的一半是很重要的,它会不会如果列不是以身份创建工作.CustomSqlType被添加到映射中,目的是在使用SchemaExport生成表时创建正确的sql.这是生成的sql:
create table [Potato] (
Id UNIQUEIDENTIFIER not null,
LegacyId INT IDENTITY(1,1) not null,
primary key (Id)
)
Run Code Online (Sandbox Code Playgroud)
另一方面,ReadOnly和Generated.Insert()将告诉NHibernate该值仅在插入时由数据库自动生成,因此它必须在数据库中查询每次插入时的值.
请注意,我只使用Sql Server对此进行了测试.自定义类型可能会更改,也可能在其他数据库中不可用.
| 归档时间: |
|
| 查看次数: |
8869 次 |
| 最近记录: |