Свободный NHibernate: как сказать, чтобы не отображать базовый класс - PullRequest
3 голосов
/ 07 декабря 2009

Последние два часа я гуглю и переполняю стек и не могу найти ответ на свой вопрос:

Я использую 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 не отображать базовый класс?

Ответы [ 4 ]

7 голосов
/ 07 декабря 2009

IncludeBase<T>

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

Подробнее здесь http://wiki.fluentnhibernate.org/Auto_mapping:)

3 голосов
/ 08 декабря 2009

Если вы не хотите автоматизировать класс, я бы рекомендовал использовать IAutoMappingOverride<T>. Я не о вашей базе данных, но это может выглядеть так:

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
    }
}

Предполагая, что вы держите эти карты в центре, вы можете загрузить их в свой autoMap:

var autoMap = AutoMap.Assembly(assembly).IgnoreBase<EntityBase>().IgnoreBase<EntityBaseValidation>()
                .UseOverridesFromAssemblyOf<CarOverride>();
1 голос
/ 13 апреля 2015

Я знаю, что это старый вопрос, но я думаю, что здесь чего-то не хватает:

Когда вы используете IgnoreBase<T>, вы говорите, что не хотите отображать наследование в вашей базе данных, но Fluent Nhibernate все равно будет отображать ваш базовый класс как отдельный класс, пока вы не скажете ему не делать этого, поэтому, если вы хотите сказать Fluent Nhibnernate не отображать сам класс, вы должны унаследовать DefaultAutoMapConfiguration класс и переопределить его bool ShouldMap(Type type) и вернуть false, если тип является любым типом, который вы вообще не хотите отображать.

Когда вы используете AutoMapping, как правило, вам не нужны никакие другие классы отображения или переопределения, если вы не хотите вносить изменения в свои отображения, и это невозможно сделать с помощью Conventions или вы просто хотите переопределить небольшую часть одного класса. (Хотя вы можете сделать то же самое, используя Conventions и Inspectors)

0 голосов
/ 07 декабря 2009

Вы можете использовать соглашение IsBaseType для ваших autoppings

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...