1

我嘗試使用Fluent Nhibernate在單個表中創建一棵樹。表必須是這樣的:enter image description here在一個表中映射「多對多」的例外情況。在類Y中找不到屬性和字段X

模型類:

public class Category 
{ 
    public virtual int CategoryId { get; set; } 
    public virtual string CategoryName { get; set; } 
    public virtual Category ParentCategory { get; set; } 
    public virtual IList<Category> ChildCategory { get; } = new List<Category>(); 
} 

映射類:

public class CategoryMap : ClassMap<Category> 
{ 
    public CategoryMap() 
    { 
     Id(x => x.CategoryId).GeneratedBy.Increment(); 
     Map(x => x.CategoryName).Not.Nullable(); 

     References(x => x.ParentCategory).Column("ParentCategoryId").Access.CamelCaseField(); 

     HasMany(x => x.ChildCategory) 
      .Cascade.AllDeleteOrphan() 
      .AsSet() 
      .KeyColumn("CategoryId") 
      .Access.CamelCaseField(); 
    } 
} 

ORM返回以下異常:

NHibernate.PropertyNotFoundException:找不到屬性也沒有 字段'childCategory'類'MyProj.Models.Category'

我只學NH。我做錯了什麼?

回答

1

您不能在字段訪問策略中使用自動屬性。您需要一個明確的後臺字段才能正常工作,並且其命名必須與您選擇的命名策略相匹配。

所以你的情況,你的類更改爲:

public class Category 
{ 
    public virtual int CategoryId { get; set; } 
    public virtual string CategoryName { get; set; } 
    public virtual Category ParentCategory { get; set; } 

    private ISet<Category> childCategory = new HashSet<Category>(); 
    public virtual ISet<Category> ChildCategory { get { return childCategory; } } 
} 

因爲您地繪製成一組,我已經改變了額外的IListISet

如果您需要支持字段的另一個名稱,請選擇另一個命名策略。請參閱here hbm映射的列表。 (或get it in NHibernate reference documentation。)流利應該有相同的策略。

您可以不使用後臺字段,而是從映射中刪除.Access.CamelCaseField(),然後向您的ChildCategory屬性添加setter。

+0

謝謝你的回答。我修復'Category'類並得到另一個異常'NHibernate.PropertyNotFoundException:在'MyProj.Models.Category'類中找不到屬性或字段'parentCategory'' – Seva

+1

@Seva,從'ParentCategory中移除'.Access.CamelCaseField()'' '映射。沒有必要使用該屬性時有一個setter。 –

0

我在下面的改變映射類:

public class Category 
    { 
     private ISet<Category> childCategories; 
     private Category parentCategory; 

     public Category() 
     { 
      childCategories = new HashSet<Category>(); 
     } 

     public virtual int CategoryId { get; protected set; } 

     public virtual string CategoryName { get; set; } 

     public virtual ReadOnlyCollection<Category> ChildCategories 
     { 
      get 
      { 
       return new ReadOnlyCollection<Category>(new List<Category>(childCategories)); 
      } 
     } 

     public virtual Category ParentCategory 
     { 
      get 
      { 
       return parentCategory; 
      } 
     } 
} 

而且它生成了異常表。

相關問題