使用约束将Guid映射到Fluent NHibernate中的列

时间:2016-12-02 12:16:33

标签: c# sql-server nhibernate fluent-nhibernate

我有一个简单的实体

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属性映射到不可为空的列,并在插入时使用自动生成的值。

1 个答案:

答案 0 :(得分:1)

看起来Fluent NHibernate缺乏为这种值指定隐式生成逻辑的方法。可以定义Default值,但使用DB特定函数会破坏DB抽象。遗憾的是,Generated属性不会暴露任何方式来注入为Insert()操作(或Update())生成值的代码。 简短的回答是&#34;没有办法强制隐式生成值或声明在映射时执行它的代码&#34;。