【问题标题】:Fluent NHibernate: How to tell it not to map a base classFluent NHibernate:如何告诉它不要映射基类
【发布时间】:2015-04-13 16:23:32
【问题描述】:

过去两个小时我一直在谷歌搜索和 stackoverflow,但找不到我的问题的答案:

我正在使用 ASP.NET MVC 和 NHibernate,我想做的只是手动映射我的实体而不映射其基类。我使用以下约定:

public class Car : EntityBase
{
    public virtual User User { get; set; }
    public virtual string PlateNumber { get; set; }
    public virtual string Make { get; set; }
    public virtual string Model { get; set; }
    public virtual int Year { get; set; }
    public virtual string Color { get; set; }
    public virtual string Insurer { get; set; }
    public virtual string PolicyHolder { get; set; }
}

EntityBase 不应该被映射的地方。

我的 NHibernate 助手类如下所示:

namespace Models.Repository
{
    public class NHibernateHelper
    {
        private static string connectionString;
        private static ISessionFactory sessionFactory;
        private static FluentConfiguration config;

        /// <summary>
        /// Gets a Session for NHibernate.
        /// </summary>
        /// <value>The session factory.</value>
        private static ISessionFactory SessionFactory
        {
            get
            {
                if (sessionFactory == null)
                {
                    // Get the connection string
                    connectionString = ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString;
                    // Build the configuration
                    config = Fluently.Configure().Database(PostgreSQLConfiguration.PostgreSQL82.ConnectionString(connectionString));
                    // Add the mappings
                    config.Mappings(AddMappings);
                    // Build the session factory
                    sessionFactory = config.BuildSessionFactory();
                }
                return sessionFactory;
            }
        }

        /// <summary>
        /// Add the mappings.
        /// </summary>
        /// <param name="mapConfig">The map config.</param>
        private static void AddMappings(MappingConfiguration mapConfig)
        {
            // Load the assembly where the entities live
            Assembly assembly = Assembly.Load("myProject");
            mapConfig.FluentMappings.AddFromAssembly(assembly);
            // Ignore base types
            var autoMap = AutoMap.Assembly(assembly).IgnoreBase<EntityBase>().IgnoreBase<EntityBaseValidation>();
            mapConfig.AutoMappings.Add(autoMap);
            // Merge the mappings
            mapConfig.MergeMappings();
        }

        /// <summary>
        /// Opens a session creating a DB connection using the SessionFactory.
        /// </summary>
        /// <returns></returns>
        public static ISession OpenSession()
        {
            return SessionFactory.OpenSession();
        }

        /// <summary>
        /// Closes the NHibernate session.
        /// </summary>
        public static void CloseSession()
        {
            SessionFactory.Close();
        }
    }
}

我现在遇到的错误是:

System.ArgumentException:类型或 方法有 2 个通用参数,但是 提供了 1 个通用参数。一个 必须提供通用参数 每个泛型参数

当我尝试添加映射时会发生这种情况。有没有其他方法可以手动映射实体并告诉 NHibernate 不要映射基类?

【问题讨论】:

  • 我没有关注。如果您想手动映射您的实体,为什么要使用AutoMap
  • 因为这是我在文档中找到的唯一方法,您可以排除以下答案中提到的基本类型。你知道通过 ClassMap 排除基类型的任何其他方法吗?

标签: c# asp.net-mvc nhibernate fluent-nhibernate


【解决方案1】:

IncludeBase&lt;T&gt;

AutoMap.AssemblyOf<Entity>()
  .IgnoreBase<Entity>()
  .Where(t => t.Namespace == "Entities");

在此处阅读更多信息http://wiki.fluentnhibernate.org/Auto_mapping :)

【讨论】:

    【解决方案2】:

    如果您不想自动映射类,我建议使用IAutoMappingOverride&lt;T&gt;。我不关心你的数据库,但它可能看起来像:

    public class CarOverride : IAutoMappingOverride<Car>
    {
    
        public void Override(AutoMapping<Car> mapping){
            mapping.Id( x => x.Id, "CarId")
              .UnsavedValue(0)
              .GeneratedBy.Identity();
    
    
            mapping.References(x => x.User, "UserId").Not.Nullable();
    
            mapping.Map(x => x.PlateNumber, "PlateNumber");
            // other properties
        }
    }
    

    假设您将这些地图放在中心位置,然后您可以将它们加载到您的自动地图上:

    var autoMap = AutoMap.Assembly(assembly).IgnoreBase<EntityBase>().IgnoreBase<EntityBaseValidation>()
                    .UseOverridesFromAssemblyOf<CarOverride>();
    

    【讨论】:

    • yuk ...这真的很难看。我应该能够告诉我的类映射 this.IgnoreBase();并且配置应该可以直接工作,不用100英里转身
    【解决方案3】:

    我知道这是一个老问题,但我认为这里缺少一些东西:

    当您使用IgnoreBase&lt;T&gt; 时,您是在告诉您不想将继承映射到您的数据库中,但Fluent Nhibernate 仍会将您的基类映射为一个单独的类,而您没有告诉它不要这样做,所以如果你想告诉Fluent Nhibnernate不要映射类本身,你应该继承DefaultAutoMapConfiguration类并覆盖它的bool ShouldMap(Type type),如果类型是你根本不想映射的任何类型,则返回false。

    当您使用AutoMapping 时,通常不需要任何其他映射类或覆盖,除非您想更改映射并且使用Conventions 是不可能的,或者您只想覆盖一小部分一类。(虽然你可以用ConventionsInspectors做同样的事情)

    【讨论】:

      【解决方案4】:

      您可以为您的自动映射使用 IsBaseType 约定

      【讨论】:

      • 当我想手动映射它们时怎么办?正如我所提到的,我不想使用自动映射......理想情况下,我想删除自动映射位并手动映射我的所有实体。但是,我不想映射我的基类。
      猜你喜欢
      • 2010-10-28
      • 2011-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2010-11-05
      相关资源
      最近更新 更多