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

C# 使用约束将Guid映射到Fluent NHibernate中的列,c#,sql-server,nhibernate,fluent-nhibernate,C#,Sql Server,Nhibernate,Fluent Nhibernate,我有一个简单的实体 我正在使用Fluent NHibernate包映射它,以实现以下约束: Id是内部数据库标识符,因此它会自动创建并定义为PK PublicId是一个公共唯一id。它被定义为具有唯一且非空约束的列,在插入时生成,与PK非常相似 Name是description,因此它是必需的(非空),但可以是任何内容 因此,我有以下映射 公共类SiteEntityMap:ClassMap { 公共站点EntityMap() { 表(“T_现场”); Id(x=>x.Id).Column

我有一个简单的实体

我正在使用
Fluent NHibernate
包映射它,以实现以下约束:

  • Id
    是内部数据库标识符,因此它会自动创建并定义为PK
  • PublicId
    是一个公共唯一id。它被定义为具有唯一且非空约束的列,在插入时生成,与PK非常相似
  • Name
    是description,因此它是必需的(非空),但可以是任何内容
因此,我有以下映射

公共类SiteEntityMap:ClassMap
{
公共站点EntityMap()
{
表(“T_现场”);
Id(x=>x.Id).Column(“site_Id”).GeneratedBy.Identity();
Map(x=>x.PublicId,“站点公共id”).Generated.Insert().ReadOnly().Unique().Not.Nullable();
Map(x=>x.Name,“site_Name”).Not.Nullable().CustomType(“AnsiString”).Unique().Length(512);
只读();
}
}
现在,如果我使用NHibernate映射创建模式,它将按照我喜欢的方式创建。但是,尝试保存已初始化字段
Name
SiteEntity
会导致
genericadeexception
,并显示以下消息:

“无法插入:[IWS.Configuration.DataModel.SiteEntity][SQL:插入到T_CFG_站点(站点名称)值(?);选择范围_标识()

如果我从
PublicId
属性的映射中删除
Not.Nullable()
,则所有操作都有效,但DB中的字段允许空值


请告知我如何将Guid属性映射到插入时自动生成值的不可空列。

看起来Fluent NHibernate缺少为此类值指定隐式生成逻辑的方法。可以定义默认值,但使用特定于DB的函数会破坏DB抽象。不幸的是,
Generated
property没有公开任何方法来注入为Insert()操作(或Update()操作)生成值的代码。
简短的回答是“无法强制隐式生成值或在映射时声明执行该操作的代码”。

在插入之前,您是否检查了实体的构造方式?站点名称似乎为空,您检查了吗?你有没有检查过有没有触发?看看这个表:T\u CFG\u SITEYes,当我调用
session.Save(siteEntity)
时,对象在Name属性中有值。我在问题中写道,尽管消息是这样的,但实际问题在于
PublicId
属性的映射。请重新阅读问题,让我知道什么不清楚,这样我可以重新措辞。
public class SiteEntity
{
    public virtual int Id {get; set;}
    public virtual Guid PublicId {get; set;}
    public virtual string Name {get; set;}
}
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();
    }
}