0

いくつかの一般的なプロパティを基本クラスに抽出し、Fluent Nhibernate でマップしようとしました。さらに、第 2 レベルの継承を追加しようとしました。

//Base entity class
public class EntityBase : IEntityBase
{
    public EntityBase()
    {
        CreatedDate = DateTime.Now;
    }
    public virtual DateTime? CreatedDate { get; set; }
    public virtual int Id { get; set; }
    public virtual int Version { get; set; }
}

//Base Entity Mapping
public class EntityBaseMap: ClassMap<EntityBase>
{
     public EntityBaseMap()
     {
         UseUnionSubclassForInheritanceMapping();
         Id(x => x.Id);
         Version(x => x.Id);
         Map(x => x.CreatedDate);
     }
}



//first sub class of EntityBase
public class Actuate : EntityBase, IActuate
{
    public virtual DateTime? ActivatedOn { get; set; }
}

//Actuate Mapping class
public class ActuateMap : SubclassMap<Actuate>
{
     public ActuateMap()
     {
         Map(x => x.ActivatedOn);
     }
}

//Sub class entity 
public class Item : Actuate
{
  public virtual string Name { get; set; }
  public virtual string Description { get; set; }
  public virtual decimal UnitPrice { get; set; }
  public virtual ItemStatus Status { get; set; }
  public virtual Store Store { get; set; }
}

//Item Mapping class
public class ItemMap : SubclassMap<Item>
{
public ItemMap()
{
        Abstract();
  Map(x => x.Name);
  Map(x => x.Description);
  Map(x => x.UnitPrice);
  Map(x => x.Status);
  References(x => x.Store);
 }

}

私が発見したエンティティに問題があります (他の関係の問題が存在する可能性があります)

//Store entity Does not inherit from EntityBase or Actuate
public class Store
{
  public virtual int Id { get; set; }
  public virtual int Version { get; set; }
  public virtual string Name { get; set; }
  public virtual IEnumerable<Item> Items { get; set; }
 }      

//Store mapping class
public class StoreMap : ClassMap<Store>
{
 public StoreMap()
 {
   Id(x => x.Id).GeneratedBy.Assigned();
   Version(x => x.Version);
   Map(x => x.Name);
   HasMany(x => x.Items);
 }
}

問題

次のクエリを実行しようとすると:

//store = is the Store entity I have retrieved from the database and I am trying  
//trying to return the items that are associated with the store and are active

store.Items != null && store.Items.Any(item => item.Status == ItemStatus.Active);

次のエラーが表示されます。

エラー

Nhibernate.Exceptions.GenericADOException: コレクションを初期化できませんでした: [SomeDomain.Store.Items#0][SQL: Select items0_.StoreId as StoreId1_, items0_.Id as Id1_, items0_.Id as Id10_0_, items0_.CreatedDate as CreatedD2_10_0_, items0_ .ActivatedOn as Activate1_11_0_, items0_.Name as Name12_0_, items0_.Description as Descript2_12_0_, items0_.UnitPrice as UnitPrice12_0_, items0_.Status as Status12_0_, items0_.StoreId as StoreId12_0_ FROM [Item] items0_ WHERE items0_.StoreId=?]"}

内部例外 「無効なオブジェクト名 'Item'。」

ここで、基本クラスを取り出して Item が継承されない場合、

ID、バージョン

列は Item エンティティの一部であり、ItemMap マッピング クラスにマップされます (ClassMap<Item>代わりに ItemMap クラスを継承すると、すべて問題なく動作します。

: StoreMap クラスの追加も試みましたが失敗しました。

HasMany(x => x.Items).KeyColumn("Id");

何かご意見は?

4

1 に答える 1

0

entityBase が共通のプロパティを継承するためのものである場合は、マップする必要はまったくありません

public class EntityBaseMap<TEntity> : ClassMap<TEntity> where TEntity : EntityBase
{
     public EntityBaseMap()
     {
         Id(x => x.Id);
         Version(x => x.Version);
         Map(x => x.CreatedDate);
     }
}

public class ActuateMap : EntityBaseMap<Actuate> { ... }

ノート:

  • バージョン マッピングは、ID ではなくバージョン プロパティをマップする必要があります
  • バージョンはコード内で読み取り専用にする必要があるため、誤って変更することはありません
  • .KeyColumn("Id")列が Items テーブルからのものであり、自動生成された ID と外部キーの両方であるため、間違っています。それは不可能だし役に立たない
  • 通常、抽象クラスのみをAbstract()マッピングに含める必要があります
于 2012-11-28T09:28:03.973 に答える