How to fine tune FluentNHibernate's auto mapper?

前端 未结 3 1446
广开言路
广开言路 2020-12-15 13:35

Okay, so yesterday I managed to get the latest trunk builds of NHibernate and FluentNHibernate to work with my latest little project. (I\'m working on a bug tracking applica

相关标签:
3条回答
  • 2020-12-15 14:03

    It's not widely known, but you can set many conventions from the Mappings section in your Configure code e.g.

    Fluently.Configure()
      .Database(/* database config */)
      .Mappings(m =>
      {
        m.FluentMappings
          .AddFromAssemblyOf<Entity>()
          .Conventions.Add(PrimaryKey.Name.Is(x => "ID"));
      })
    

    to set a Primary Key convention.

    Edit: Clarification of what the PrimaryKey convention does:

    The PrimaryKey convention is used to specify what the column of the primary key is, not the property. Discovering the property is a pure automapping exercise, while conventions are applied to ClassMaps and automappings. – James Gregory

    This is the list of supported conventions (from the wiki):

    Table.Is(x => x.EntityType.Name + "Table")
    PrimaryKey.Name.Is(x => "ID")
    AutoImport.Never()
    DefaultAccess.Field()
    DefaultCascade.All()
    DefaultLazy.Always()
    DynamicInsert.AlwaysTrue()
    DynamicUpdate.AlwaysTrue()
    OptimisticLock.Is(x => x.Dirty())
    Cache.Is(x => x.AsReadOnly())
    ForeignKey.EndsWith("ID")
    

    See The Simplest Conventions section on the FNH wiki.

    0 讨论(0)
  • 2020-12-15 14:07

    For your Id woes, you need to change the FindIdentity setting. It's covered in the automapping wiki page, although albeit briefly.

    It should go something like this:

    AutoMap.AssemblyOf<Entity>() // your usual setup
      .Setup(s =>
      {
        s.FindIdentity = m => m.Name == "ID";
      });
    

    What this does is instruct the automapper to use your new lambda (m => m.Name == "ID") when trying to discover Ids. m is the property/member, and this lambda is called for each property on each entity; whichever you return true for is the id.

    0 讨论(0)
  • 2020-12-15 14:24

    You can use Auto Mapping Overrides to change how the Auto Mapper work, and you can also define Conventions, that will be used instead by the auto mapper.

    Here is an example on how to use both the conventions and the overrides:

    var mappings = new AutoPersistenceModel();
    mappings.Conventions.Setup(s => s.Add<ColumnNullabilityConvention>());
    mappings.UseOverridesFromAssemblyOf<AssemblyName>();
    
    // This convention will set all properties to be not nullable
    
    public class ColumnNullabilityConvention: IPropertyConvention, IPropertyConventionAcceptance
    {
       public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
       {
           criteria.Expect(x => x.Nullable, Is.Not.Set);
       }
    
       public void Apply(IPropertyInstance instance)
       {
           instance.Not.Nullable();
       }
    }
    
    // This override will change "string" to use "text" instead of "varchar(255)".
    // Also set the property to be not nullable
    
    public class SomeOverrideInTheSameAssembly : IAutoMappingOverride<TypeName>
    {
       public void Override(AutoMapping<TypeName> mapping)
       {
           mapping.Map(x => x.Property).CustomType("StringClob").CustomSqlType("text");
           mapping.Map(x => x.Property).Not.Nullable();
       }
    }    
    

    Check these links for more examples:

    • How to setup conventions and overrides
    • Some convention overrides
    • Fluent NHibernate Conventions FAQ
    • Another SO link about this topic
    0 讨论(0)
提交回复
热议问题