10

なにかしら。私はここに解決策を持って座っています。2つのサブクラスを持つ1つのスーパークラスがあり、現在、JoinedSubClassを使用してこれをマッピングしていますが、このメソッドは廃止されており、ClassMapとSubClassMapが必要であると言われていますが、これを行うとAutoMappingは機能しません、そして私はそれを望んでいません。これに対する回避策はありますか?

階層は次のとおりです。

public class Tag : Entity
{

public virtual string Name {get;set;}
public virtual User User {get;set;}

}

public class RespondentTag : Tag
{
    public virtual IList<Respondent> Respondents {get;set;}
}


public class ArchiveTag : Tag
{
    public virtual IList<Survey> Surveys {get;set;}
}

おそらくお気づきかもしれませんが、これを階層ごとのテーブルにしたいのです。多対多のリストを持つサブクラスをマッピングします。テーブル'Tag'のように、次にTag_RespondentとTag_Archive(多対多の関係の場合)。

現在使用しているマッピングは次のとおりです。

public class TagMap : IAutoMappingOverride<Tag>
{
  public void Override(AutoMapping<Tag> mapping)
  { 
     //This is obsolete
     mapping.JoinedSubClass("RespondentTagId", RespondentTagMap.AsJoinedSubClass());
     mapping.JoinedSubClass("ArchiveTagId", ArchiveTagMap.AsJoinedSubClass());

  }
}

public class RespondentTagMap
{
    public static Action<JoinedSubClassPart<RespondentTag>> AsJoinedSubClass()
    {
     return part =>

        part.HasManyToMany(x => x.RespondentList)
           .Cascade
           .SaveUpdate()
           .Inverse()
           .Table("Tag_Respondent");

    }
}


public class ArchiveTagMap
{
    public static Action<JoinedSubClassPart<ArchiveTag>> AsJoinedSubClass()
    {
     return part =>

        part.HasManyToMany(x => x.Surveys)
           .Cascade
           .SaveUpdate()
           .Inverse()
           .Table("Tag_Archive");

    }
}

誰かがこれを解決するための回避策または別の解決策について知っていますか?(自動マッピングを無効にせずに)

任意の回答をいただければ幸いです。

前もって感謝します!

4

1 に答える 1

1

私があなたの目的を誤解している場合は申し訳ありませんが、プロジェクトで同様の継承を行っているため、これを突き刺します(ただし、識別子列でベースクラスごとのテーブルパターンを使用しています)。

FNH に基本クラスを無視させ、オブジェクトとオブジェクトTagのマッピングをオーバーライドして多対多の関係を実装することで、目的を達成できると思います。したがって、FNH 構成では、次のマッピング呼び出しに引数を指定します。RespondentTagArchiveTag

m.AutoMappings.Add(AutoMap.AssemblyOf<SomeObjectInMyAssembly>(new MyAutoMapConfig()) // Assuming you're using a config class
    .IgnoreBase(typeof(Entity))
    .IgnoreBase(typeof(Tag))
    .UseOverridesFromAssemblyOf<SomeOverrideClass>());

次に、保存しているアセンブリにオーバーライドを設定する必要があります。次のようなものがあります。

public class RespondentTagOverride : IAutoMappingOverride<RespondentTag>
{
    public void Override(AutoMapping<RespondentTag> mapping)
    {
        mapping.HasManyToMany(x => x.RespondentList)
            .Cascade
            .SaveUpdate()
            .Inverse()
            .Table("Tag_Respondent"); // Not sure if the table call works in the override...you may have to use a convention for this
    }
}

ArchiveTagオブジェクトについても同じです。

これは、継承スキームで行っていることと似ていますが、前述したように、automap 構成クラスでIsDiscriminatedメソッドをオーバーライドして、オブジェクトが table-per-base-class であり、識別されていることを示します。

于 2011-08-05T21:44:55.503 に答える