簡體   English   中英

流利的NHibernate:基類的ISet

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM