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 application.) I created a nice data access layer using the Repository pattern.
I decided that my entities are nothing special, and also that with the current maturity of ORMs, I don't want to hand-craft the database. So, I chose to use FluentNHibernate's auto mapping feature with NHibernate's "hbm2ddl.auto" property set to "create".
It really works like a charm. I put the NHibernate configuration in my app domain's config file, set it up, and started playing with it. (For the time being, I created some unit tests only.) It created all tables in the database, and everything I need for it. It even mapped my many-to-many relationships correctly.
However, there are a few small glitches:
Is there a way to tell the auto mapper about the two simple rules above?
If the answer is no, will it work correctly if I modify the tables it created? (So, if I set some columns not to allow null, and change the allowed length for some other, will it correctly work with them?)
FINAL EDIT: Big Thanks to everyone who dropped by and helped out. All of my issues with Fluent are solved now.
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:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With