我在想什么我坐在这里的解决方案那里,我有1个父类(super class),其中有2个子类,我目前正在使用JoinedSubClass映射它,但是我知道此方法已经过时了,并说我应该使用ClassMap和SubClassMap,但是如果我这样做的话自动映射功能不起作用,我也不想这样做。有什么解决方法吗?

这是层次结构:

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_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");

    }
}

有谁知道解决方法或解决此问题的其他解决方案? (不禁用自动映射)

任何答案将不胜感激。

提前致谢!

最佳答案

如果我误解了您的目标,请原谅我,但我会对此稍加刺痛,因为我在项目中具有类似的继承性(尽管我在区分符列中使用了基于基表的模式)。

我相信您可以通过让FNH忽略Tag基类,然后覆盖RespondentTagArchiveTag对象上的映射以实现多对多关系来完成您想要的工作。因此,在FNH配置中,您可以为映射调用指定一个参数:

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对象相同。

这类似于我在继承方案中所做的事情,但是正如我提到的那样,在我的自动映射配置类中,我重写了IsDiscriminated方法以指示我的对象是基于基类的表并已被区分。

关于.net - 流利的NHibernate JoinedSubClass已过时,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3316291/

10-11 02:11