Fluent nhibernate Fluent NHibernate-ValidationException实体没有映射的Id

Fluent nhibernate Fluent NHibernate-ValidationException实体没有映射的Id,fluent-nhibernate,Fluent Nhibernate,使用FNH生成scema时出现以下错误: ValidationException: The Entity 'TemplateStatusInfo' dows not have an Id mapped. 类映射定义如下: [DataContract] public abstract class Template { [DataMember] public virtual int? Id { get; set; } [DataMember] public virt

使用FNH生成scema时出现以下错误:

ValidationException: The Entity 'TemplateStatusInfo' dows not have an Id mapped.
类映射定义如下:

[DataContract]
public abstract class Template
{
    [DataMember]
    public virtual int? Id { get; set; }
    [DataMember]
    public virtual string Title { get; set; }
    [DataMember]
    public virtual TemplateStatusInfo TemplateStatus { get; set; }
}

[DataContract]
public class TemplateStatusInfo
{
    [DataMember]
    public virtual List<string> ValidCodes { get; set; }
    [DataMember]
    public virtual string TemplateError { get; set; }
}
[DataContract]
公共抽象类模板
{
[数据成员]
公共虚拟int?Id{get;set;}
[数据成员]
公共虚拟字符串标题{get;set;}
[数据成员]
公共虚拟模板状态信息模板状态{get;set;}
}
[数据合同]
公共类TemplateStatusInfo
{
[数据成员]
公共虚拟列表有效代码{get;set;}
[数据成员]
公共虚拟字符串模板错误{get;set;}
}
映射:

public class TemplateMap : ClassMap<Template>
{
    public const string TableName = "Template";

    public TemplateMap()
    {
        Table(TableName);
        Id(x => x.Id).UnsavedValue(null).GeneratedBy.Native();
        Map(x => x.Title).Not.Nullable().Length(150);          
        DiscriminateSubClassesOnColumn("type");
    }
}

public class TemplateStatusInfoMap : ClassMap<TemplateStatusInfo>
{
    public TemplateStatusInfoMap()
    {
        Table(TemplateMap.TableName);

        HasMany(x => x.ValidCodes).Table("TemplateValidCodes").KeyColumn("Id").Element("CodeName").AsSet().Cascade.AllDeleteOrphan();
        Map(x => x.TemplateError).Length(1000);
    }
}
公共类模板映射:类映射
{
public const string TableName=“模板”;
公共模板映射()
{
表(表名);
Id(x=>x.Id).UnsavedValue(null).GeneratedBy.Native();
Map(x=>x.Title).Not.Nullable().Length(150);
区分子类子列(“类型”);
}
}
公共类TemplateStatusInfoMap:ClassMap
{
公共模板StatusInfoMap()
{
表(TemplateMap.TableName);
HasMany(x=>x.ValidCodes).Table(“TemplateValidCodes”).KeyColumn(“Id”).Element(“CodeName”).AsSet().Cascade.AllDeleteOrphan();
Map(x=>x.TemplateError).Length(1000);
}
}
它应该生成两个表“Template”(列为-Id,Title,TemplateError)和子表“TemplateValidCodes”(列为-Id,代码名)


任何人都可以在这里指导我如何映射TemplateStatusInfo的Id(基本上是Template.Id)?

您正在尝试建立多(有效代码)一(TemplateStatusInfo)关联,但TemplateStatusInfo没有Id,所以数据库如何关联这些信息?此外,您没有在模板映射中映射TemplateStatus

我认为您的数据结构需要重新考虑一下

TemplateStatusInfo可能应该映射为模板的一个组件,而不是一个单独的实体

试试这个:

public class TemplateMap : ClassMap<Template>
{
    public const string TableName = "Template";

    public TemplateMap()
    {
        Table(TableName);
        Id(x => x.Id).UnsavedValue(null).GeneratedBy.Native();
        Map(x => x.Title).Not.Nullable().Length(150);
        Component(x => x.TemplateStatus, TemplateStatusInfoComponentMap.Map);          
        DiscriminateSubClassesOnColumn("type");
    }
}

public class TemplateStatusInfoComponentMap
    {
        public static void Map(ComponentPart<TemplateStatusInfo> part)
        {
           part.HasMany(x => x.ValidCodes).Table("TemplateValidCodes").KeyColumn("Id").Element("CodeName").AsSet().Cascade.AllDeleteOrphan();
           part.Map(x => x.TemplateError).Length(1000);
        }
    }
公共类模板映射:类映射
{
public const string TableName=“模板”;
公共模板映射()
{
表(表名);
Id(x=>x.Id).UnsavedValue(null).GeneratedBy.Native();
Map(x=>x.Title).Not.Nullable().Length(150);
组件(x=>x.TemplateStatus,TemplateStatusInfoComponentMap.Map);
区分子类子列(“类型”);
}
}
公共类TemplateStatusInfoComponentMap
{
公共静态无效映射(组件部分)
{
part.HasMany(x=>x.ValidCodes).Table(“TemplateValidCodes”).KeyColumn(“Id”).Element(“CodeName”).AsSet().Cascade.AllDeleteOrphan();
part.Map(x=>x.TemplateError).Length(1000);
}
}