2010-11-25 2 views
0

がマッピングされていません。流暢NHibernateは - にValidationExceptionエンティティは、IdはFNHとscemaを生成中に次のエラーを取得

[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); 
    } 
} 
以下のように定義

ValidationException: The Entity 'TemplateStatusInfo' dows not have an Id mapped. 

クラスのマッピングを

2つのテーブル "テンプレート"(列にId、Title、TemplateError)と子テーブル "TemplateValidCodes"(列Id、CodeName)。

誰でもここでTemplateStatusInfoのIDをマップすることができます(本質的にTemplate.Idになります)。

答えて

1

多くの(ValidCodes)1(TemplateStatusInfo)の関連付けを持っていますが、TemplateStatusInfoにはIDがないので、データベースはこれらの情報をどのように関連付けることができますか?また、テンプレートマッピングで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); 
     } 
    } 
関連する問題