![](/img/trans.png)
[英]Fluent Nhibernate Automapping with overrides: Map an unmapped base class collection
[英]How can I use my abstract base class in a One to Many in a TPH using Fluent NHibernate automapping?
我正在嘗試使用Giveaway.Giveable接受Giveable的任何子類,但是由於Giveable是抽象的基類,因此實際上並未映射。 我正在使用每個層次結構的表而不是TPT。
我包含的類可幫助其他用戶並提供NHibernate的更多實際示例,請原諒所有代碼。
例外:表贈品中的關聯是指未映射的類:Giveable
AutoMap.AssemblyOf<Giveaway>(cfg).UseOverridesFromAssemblyOf<UserMappingOverride>()
.Conventions.Add(
PrimaryKey.Name.Is(x => "ID"),
DefaultLazy.Always(),
DefaultCascade.Delete(),
DynamicInsert.AlwaysTrue(),
DynamicUpdate.AlwaysTrue(),
OptimisticLock.Is(x => x.Dirty()),
ForeignKey.EndsWith("ID")))).ExposeConfiguration(BuildSchema)
public abstract class Giveable
{
ISet<Giveaway> giveaways;
public Giveable() : base()
{
giveaways = new HashedSet<Giveaway>();
}
public virtual ISet<Giveaway> Giveaways
{
get { return giveaways; }
set { giveaways = value; }
}
public virtual int ID { get; set; }
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
var toCompareWith = obj as Giveable;
return toCompareWith != null && ((ID == toCompareWith.ID));
}
public override int GetHashCode()
{
int toReturn = base.GetHashCode();
toReturn ^= ID.GetHashCode();
return toReturn;
}
}
public class Giveaway
{
ISet<Entry> entries;
public Giveaway() : base()
{
entries = new HashedSet<Entry>();
CreatedDate = DateTime.UtcNow;
}
public virtual DateTime CreatedDate { get; private set; }
public virtual DateTime? EndDate { get; set; }
public virtual ISet<Entry> Entries
{
get { return entries; }
set { entries = value; }
}
public virtual Giveable Giveable { get; set; }
public virtual int ID {get;set;}
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
var toCompareWith = obj as Giveaway;
return toCompareWith != null && ((ID == toCompareWith.ID));
}
public override int GetHashCode()
{
int toReturn = base.GetHashCode();
toReturn ^= ID.GetHashCode();
return toReturn;
}
}
public class GiveableMappingOverride : IAutoMappingOverride<Giveable>
{
public void Override(AutoMapping<Giveable> mapping)
{
mapping.DiscriminateSubClassesOnColumn("GiveableType");
mapping.Map(x => x.Name).Length(200).Not.Nullable();
mapping.Map(x => x.ImageName).Length(200).Nullable();
mapping.Map(x => x.ReleaseDate).Not.Nullable();
mapping.HasMany(x => x.Giveaways)
.Fetch.Select()
.AsSet()
.Inverse()
.LazyLoad();
}
}
public class GiveawayMappingOverride : IAutoMappingOverride<Giveaway>
{
public void Override(AutoMapping<Giveaway> mapping)
{
mapping.Map(x => x.ThingID).Length(20).Nullable();
mapping.Map(x => x.Text).Length(2000).Not.Nullable();
mapping.Map(x => x.CreatedDate).Not.Nullable();
mapping.Map(x => x.Platform).Not.Nullable();
mapping.Map(x => x.Type).Not.Nullable();
mapping.HasMany(x => x.Entries);
mapping.References(x => x.Giveable).Not.Nullable();
mapping.References(x => x.User).Not.Nullable();
mapping.References(x => x.Winner);
}
}
我必須包含我的抽象類,因為我正在使用它。 Giveaway.Giveable。
public class AppMappingOverride : IAutoMappingOverride<App>
{
public void Override(AutoMapping<App> mapping)
{
mapping.DynamicUpdate();
mapping.DynamicInsert();
mapping.HasManyToMany(x => x.Subscriptions).Inverse();
mapping.HasManyToMany(x => x.Users).Inverse();
}
}
public class SubscriptionMappingOverride : IAutoMappingOverride<Subscription>
{
public void Override(AutoMapping<Subscription> mapping)
{
mapping.DynamicInsert();
mapping.DynamicUpdate();
mapping.HasManyToMany(x => x.Apps);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.