流畅的NHibernate - ValidationException实体没有Id映射

时间:2010-11-25 14:37:28

标签: 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 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; }
}

映射:

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);
    }
}

它应该导致两个表“Template”(带有列-Id,Title,TemplateError)和子表“TemplateValidCodes”(带有列-Id,CodeName)。

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

1 个答案:

答案 0 :(得分:1)

您尝试使用多个(ValidCodes)一个(TemplateStatusInfo)关联,但TemplateStatusInfo没有id,那么数据库如何关联这些信息呢?您也没有在Template映射中映射TemplateStatus。

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

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

试试这个:

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);
        }
    }
相关问题