Fluent NHibernate игнорирует свойство внутри ClassMap, используя FluentMappings - PullRequest
3 голосов
/ 16 марта 2012

Я использую NHibernate 3.1 и Fluent NHibernate в качестве ORM в моем проекте. Мне нужно, чтобы свойство POCO игнорировалось Fluent NHibernate. Сначала мой пост может выглядеть как точная копия этого вопроса , но это не так.

Мои осложнения возникают в первую очередь из-за того, что POCO определены в сборке, отличной от отображения, и я использую плавные отображения для моих POCO. У меня есть дополнительное требование не писать код свойства ingore, где конфигурация фабрики сеанса имеет место (это происходит в централизованном месте вне модулей), а как часть модуля, который определяет отображения. В идеале я считаю, что правильным местом будет конкретная реализация ClassMap, поскольку она точно знает, как описать POCO для ORM.

Тем не менее, я застрял на этом, главным образом, потому что это мое первое знакомство с NHibernate и его беглым API. До сих пор у меня было очень хорошее впечатление о его возможностях и расширяемости, и я надеюсь, что есть способ выполнить мое требование таким образом, чтобы код, связанный с отображением, был инкапсулирован в соответствующий модуль.

Вот моя конфигурация из централизованного места:

List<Assembly> assemblies = GetModules().Select(x => x.GetType().Assembly).ToList();

ISessionFactory nhibernateSessionFactory = Fluently
    .Configure()
    .Mappings(m => assemblies.ForEach(asm => m.FluentMappings.AddFromAssembly(asm)))
    .Database(
        MsSqlConfiguration.MsSql2005
            .ShowSql()
            .ConnectionString(DatabaseConfig.Instance.ConnectionString))
    .ExposeConfiguration(c => new SchemaUpdate(c).Execute(true, true))
    .BuildSessionFactory();

Я использую стандартные сопоставления классов, которые наследуются от ClassMap:

public class User
{
    public virtual int ID { get; set; }
    public virtual String Username { get; set; }
    public virtual String Password { get; set; }
    public virtual DateTime DateCreated { get; set; }
    public virtual DateTime DateModified { get; set; }

    // Must ignore
    public string ComputedProperty  { get { ... } }
}

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Table("User");
        Id(x => x.ID).GeneratedBy.Identity();
        Map(m => m.Username).Not.Nullable().Length(255).UniqueKey("User_Username_Unique_Key");
        Map(m => m.Password).Not.Nullable().Length(255);
        Map(m => m.DateCreated).Not.Nullable();
        Map(m => m.DateModified).Not.Nullable();
    }
}

Ответы [ 3 ]

5 голосов
/ 19 декабря 2012

Я знаю, что это сообщение немного устарело, но я все равно публикую его, так как не нашел ни одного обновления по этой теме Я предполагаю, что самый простой способ - добавить атрибут к каждому свойству, которое мы не хотим сохранять в таблице. Добавив расширение, которое проверяет, если оно имеет, например. имеет атрибут [NoEntity].

/// <summary>
/// Tells a single Property to not be persisted to table.
/// </summary>
public class NoEntity : Attribute { }


    /// <summary>
/// Extension to ignore attributes
/// </summary>
public static class FluentIgnore
{
    /// <summary>
    /// Ignore a single property.
    /// Property marked with this attributes will no be persisted to table.
    /// </summary>
    /// <param name="p">IPropertyIgnorer</param>
    /// <param name="propertyType">The type to ignore.</param>
    /// <returns>The property to ignore.</returns>
    public static IPropertyIgnorer SkipProperty(this IPropertyIgnorer p, Type propertyType)
    {
        return p.IgnoreProperties(x => x.MemberInfo.GetCustomAttributes(propertyType, false).Length > 0);
    }
}

А в настройках беглого конфига:

            return Fluently.Configure()
            .Database(DatabaseConfig)
            .Mappings(m => m.AutoMappings.Add(AutoMap.Assembly(typeof(IDependency).Assembly)
            .OverrideAll(p => {
                p.SkipProperty(typeof(NoEntity)); 
            }).Where(IsEntity)))
            .ExposeConfiguration(ValidateSchema)
            .ExposeConfiguration(BuildSchema)
            .BuildConfiguration();
4 голосов
/ 16 марта 2012

Я думаю, вы правы, что ClassMap - лучшее место, чтобы игнорировать это свойство.

Пример:

.Override<Shelf>(map =>  
{  
  map.IgnoreProperty(x => x.YourProperty);
});

Документация: https://github.com/jagregory/fluent-nhibernate/wiki/Auto-mapping#ignoring-properties

Что касается получения сопоставлений из другой сборки, это должно быть так просто, как это (в зависимости от вашей текущей конфигурации):

.Mappings(m =>
              {
                  m.FluentMappings.AddFromAssemblyOf<ProvideClassFromYourOtherAssembly>();
              });
0 голосов
/ 23 марта 2016

не будет Джастин. Это вещь с этим расширением. Просто свойство, которое вы хотите, игнорируется.

public class Person : IEntity{ 
 public virtual string Name{..}
 public virtual string Lastname{..}

 [NoProperty]
 public virtual string FullName{ // Not created property
  get { return Name +  " " + Lastname;  }
 }
}

public class Group : IEntity{ 
 public virtual string FullName{..} //Created property
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...