2010-11-25 3 views
0

Erste Fehler folgende während scema mit FNH zu erzeugen:Fluent NHibernate - Validation Entity hat keine ID zugeordnet

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

Klasse Mapping wie folgt definiert:

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

Mappings:

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

Es sollte zwei Tabellen "Template" (mit Spalten-Id, Titel, TemplateError) und Kind ergeben Tabelle "TemplateValidCodes" (mit Spalten-Id, CodeName).

Kann mir bitte jemand Anleitung, wie kann ich ID für TemplateStatusInfo hier (die im Wesentlichen Template.Id sein) zuordnen?

Antwort

1

Sie versuchen, eine (ValidCodes) one (TemplateStatusInfo) -Assoziation zu haben, aber TemplateStatusInfo hat keine ID, also wie kann die Datenbank diese Informationen in Beziehung setzen? Außerdem haben Sie TemplateStatus nicht in der Vorlagenzuordnung zugeordnet.

Ich denke, dass Ihre Datenstruktur ein bisschen überdenken muss.

Wahrscheinlich sollte TemplateStatusInfo als eine Komponente von Template zugeordnet werden, anstatt eine separate Entität zu sein.

Versuchen Sie folgendes:

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