我有一个简单的实体
public class SiteEntity
{
public virtual int Id {get; set;}
public virtual Guid PublicId {get; set;}
public virtual string Name {get; set;}
}
我使用Fluent NHibernate
包映射它以实现以下约束:
Id
是内部数据库标识符,因此它会自动创建并定义为PK PublicId
是公共唯一ID。它被定义为具有唯一且非空约束的列,并且在插入时生成,就像PK Name
是描述所以它是必需的(非空)但可以是任何结果我有以下映射
public class SiteEntityMap : ClassMap<SiteEntity>
{
public SiteEntityMap()
{
Table("T_SITE");
Id(x => x.Id).Column("site_id").GeneratedBy.Identity();
Map(x => x.PublicId, "site_public_id").Generated.Insert().ReadOnly().Unique().Not.Nullable();
Map(x => x.Name, "site_name").Not.Nullable().CustomType("AnsiString").Unique().Length(512);
ReadOnly();
}
}
现在,如果我使用NHibernate映射创建模式,它就像我喜欢的那样创建。但是,尝试将SiteEntity
字段Name
初始化的结果保存在GenericADOException
中并显示以下消息:
“无法插入:[IWS.Configuration.DataModel.SiteEntity] [SQL:INSERT INTO T_CFG_SITE(site_name)VALUES(?);选择SCOPE_IDENTITY()]”
如果我从Not.Nullable()
属性的映射中删除PublicId
,一切正常,但DB中的字段允许NULL。
请告知我如何将Guid属性映射到不可为空的列,并在插入时使用自动生成的值。
答案 0 :(得分:1)
看起来Fluent NHibernate缺乏为这种值指定隐式生成逻辑的方法。可以定义Default值,但使用DB特定函数会破坏DB抽象。遗憾的是,Generated
属性不会暴露任何方式来注入为Insert()操作(或Update())生成值的代码。
简短的回答是&#34;没有办法强制隐式生成值或声明在映射时执行它的代码&#34;。