dbn*_*n2k 10 .net nhibernate fluent-nhibernate automapping joined-subclass
我不知道什么.我坐在这里有一个解决方案我有1个超类,有2个子类,我现在使用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;}
}
Run Code Online (Sandbox Code Playgroud)
正如您可能想到的那样,我希望这是一个每个层次结构的表 - 映射与子类的列表是多对多.就像表'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");
}
}
Run Code Online (Sandbox Code Playgroud)
有没有人知道解决方法或解决此问题的其他解决方案?(不禁用自动化)
任何答案将不胜感激.
提前致谢!
如果我误解了你的目标,请原谅我,但我会尝试一下,因为我的项目中有类似的继承(尽管我使用带有鉴别器列的每基类表模式)。
我相信您可以通过让 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>());
Run Code Online (Sandbox Code Playgroud)
然后,您必须在存储它们的任何程序集中设置覆盖。你会有这样的东西:
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
}
}
Run Code Online (Sandbox Code Playgroud)
对于对象来说也是如此ArchiveTag。
这与我在继承方案中所做的类似,尽管正如我所提到的,在我的自动映射配置类中,我重写了该IsDiscriminated方法以指示我的对象是每个基类一个表并且是有区别的。
| 归档时间: |
|
| 查看次数: |
724 次 |
| 最近记录: |