【问题标题】:Fluent Nhibernate modify default idFluent Nhibernate 修改默认id
【发布时间】:2011-10-21 09:09:48
【问题描述】:
今天我一直在设置流畅的nhibernate。
我遇到了 Ids,当我将一个类映射到另一个类时,
我必须指定类映射到的 id。
因为我的 id 总是类名 + id。
nhibernate 具有默认的类名 + "_"+ id。
所以当我必须按如下方式创建映射时:
Id(x => x.MenuItemId, "MenuItemId");
如何根据需要覆盖设置,因此我只能使用映射作为
Id(x=>x.MenuItemId)
只有当我加入其他课程时才会出现问题,例如
在 MenuItem 上加入实体菜单,我使用
HasMany(x=>x.MenuItems).Class(typeOf(Menu))
【问题讨论】:
标签:
fluent-nhibernate
mapping
【解决方案1】:
发现这个:
这就是解决方案。
身份
自动映射器是固执己见的,它希望您的类以特定的方式设计;如果不是,那么在没有一点帮助的情况下将无法自动映射它们。自动映射器希望您的身份被命名为 Id,如果不是,它将找不到它们。
您可以通过覆盖自动映射配置中的 IsId 方法来修改自动映射器发现身份的方式。将为实体中已被 ShouldMap(Member) 条件接受的所有成员调用此方法;您为其返回 true 的任何成员都将被映射为身份。
public override bool IsId(Member member)
{
return member.Name == member.DeclaringType.Name + "Id";
}
该示例将匹配以其实体命名的任何 ID,例如 CustomerId。
并调用它:
return Fluently.Configure()
.MsSql2008
.ConnectionString(c => c.FromConnectionStringWithKey("database"))
.ShowSql()
.ProxyFactoryFactory("NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu"))
.Mappings(x => x.FluentMappings
.AddFromAssembly(
Assembly.GetExecutingAssembly())
.Conventions.AddFromAssemblyOf<Location.IdConvention>())
.BuildSessionFactory();
在你设置 id convencion 之后
public class IdConvention : IIdConvention
{
public void Apply(IIdentityInstance identityInstance)
{
identityInstance.Column(identityInstance.EntityType.Name + "Id");
}
}