[英]Fluent NHibernate: ISet of base class
在我的項目中,我有一個基類(未映射):
public abstract class BaseEntity
{
public virtual string Name { get; set; }
public virtual string Description { get; set; }
}
我也有一些繼承的類(它們看起來幾乎都一樣,所以這是僅一個的代碼和映射)
public class User : BaseEntity
{
public virtual int UserId { get; set; }
public virtual string Login { get; set; }
public virtual string PasswordHash { get; set; }
public virtual ISet<BaseEntity> Entities { get; set; }
}
public class UserMap : ClassMap<User>
{
public UserMap()
{
this.Id(x => x.UserId);
this.Map(x => x.Login);
this.Map(x => x.PasswordHash);
this.HasManyToMany<BaseEntity>(x => x.Entities);
}
}
接下來,我有一個NHibernateHelper:
public class NHibernateHelper
{
public static ISession OpenSession()
{
ISessionFactory sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(@"someconstring")
.ShowSql()
)
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<User>())
.ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(false, true))
.BuildSessionFactory();
return sessionFactory.OpenSession();
}
}
如果我需要數據庫中的表EnitiyToEntity這樣的多對多關系,如何從映射中排除BaseEntity類?
看看這個: https : //www.codeproject.com/Articles/232034/Inheritance-mapping-strategies-in-Fluent-Nhibernat
如果我理解您的問題,解決方案應該是實現TPC(每個具體類的表)。
順便說一句,在映射中,您必須為HasManyToMany
使用具體類型。
例如(我假設您的用戶被引用到許多組):
HasManyToMany<Group>(x => x.Entities).Table("UsersGroups");
Group
類是這樣的:
public class Group : BaseEntity
{
public virtual int GroupId { get; set; }
public virtual string PasswordHash { get; set; }
public virtual ISet<BaseEntity> Members { get; set; }
}
在GroupMap類中,您可以像這樣引用用戶:
HasManyToMany<User>(x => x.Members).Table("UsersGroups");
如果引用一個類,則必須對其進行映射。 因此,將Entity映射為ClassMap,將所有其他映射為SubclassMap。 它們最終將成為並集子類,每個類一個表。 不幸的是,您無法使用FNH映射hasmanytoany。 您可以將其映射為hasmanytomany並解決它:
var config = new Configuration();
config.BeforeBindMapping += BeforeBindMapping;
_config = Fluently
.Configure(config)
...
private void BeforeBindMapping(object sender, NHCfg.BindMappingEventArgs e)
{
var userclass = e.Mapping.RootClasses.FirstOrDefault(rc => rc.name.StartsWith(typeof(User).FullName));
if (userclass != null)
{
HbmSet prop = (HbmSet)paymentclass.Properties.FirstOrDefault(rc => rc.Name == "Entities");
prop.Item = new HbmManyToAny // == prop.ElementRelationship
{
column = new[]
{
new HbmColumn { name = "entityType", notnull = true, notnullSpecified = true },
new HbmColumn { name = "entity_id", notnull = true, notnullSpecified = true }
},
idtype = "Int64",
metatype = "String",
metavalue = typeof(Entity).Assembly.GetTypes()
.Where(t => !t.IsInterface && !t.IsAbstract && typeof(Entity).IsAssignableFrom(t))
.Select(t => new HbmMetaValue { @class = t.AssemblyQualifiedName, value = t.Name })
.ToArray()
};
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.