好的,昨天我设法获得了NHibernate和FluentNHibernate的最新主干版本来处理我最新的小项目。 (我正在开发一个bug跟踪应用程序。)我使用Repository模式创建了一个很好的数据访问层。
我认为我的实体并不特别,而且随着ORM的成熟,我不想手工制作数据库。 所以,我选择使用FluentNHibernate的自动映射功能,将NHibernate的“hbm2ddl.auto”属性设置为“create”。
它真的像一个魅力。我将NHibernate配置放在我的app域的配置文件中,进行设置,并开始使用它。 (暂时,我只创建了一些单元测试。)它创建了数据库中的所有表,以及我需要的所有表。它甚至正确地映射了我的多对多关系。
然而,有一些小故障:
有没有办法告诉自动映射器上面的两个简单规则?
如果答案为否,如果我修改它创建的表,它会正常工作吗? (所以,如果我设置一些列不允许为null,并更改其他一些列的允许长度,它是否能正确使用它们?)
最终编辑: 非常感谢所有匆匆离去并帮助过的人。 我现在解决了Fluent的所有问题。
答案 0 :(得分:6)
您可以使用自动映射覆盖来更改自动映射器的工作方式,还可以定义约定,这些约定将由自动映射器使用。
以下是有关如何使用约定和覆盖的示例:
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();
}
}
查看以下链接以获取更多示例:
答案 1 :(得分:3)
对于您的身份问题,您需要更改FindIdentity
设置。 automapping wiki page涵盖了它,虽然虽然简短。
它应该是这样的:
AutoMap.AssemblyOf<Entity>() // your usual setup
.Setup(s =>
{
s.FindIdentity = m => m.Name == "ID";
});
这样做是指示automapper在尝试发现ID时使用新的lambda(m => m.Name == "ID"
)。 m
是属性/成员,并且为每个实体的每个属性调用此lambda;无论你返回的是什么,都是id。
答案 2 :(得分:1)
它并不为人所知,但您可以在配置代码中的Mappings部分设置许多约定,例如
Fluently.Configure()
.Database(/* database config */)
.Mappings(m =>
{
m.FluentMappings
.AddFromAssemblyOf<Entity>()
.Conventions.Add(PrimaryKey.Name.Is(x => "ID"));
})
设置主键约定。
编辑:澄清PrimaryKey约定的作用:
PrimaryKey约定用于 指定列的内容 主键是,而不是属性。 发现该物业是一个纯粹的 自动化运动,而 约定适用于ClassMaps 和自动化。 - 詹姆斯格雷戈里
这是支持的约定列表(来自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")
请参阅FNH wiki上的The Simplest Conventions部分。