2011-08-06 116 views
0

今天我一直在设置流利的nhibernate。 我碰到了ID和当我映射到另一个类, 我不得不指定类映射到什么id。 由于我的id始终是class name + id。流利Nhibernate修改默认ID

nhibernate具有默认类名+“_”+ id。

所以当我要创建的映射如下:

ID(X => x.MenuItemId, “MenuItemId”);

我如何覆盖的设置是因为我需要为此和我只能使用映射为

ID(X => x.MenuItemId)

的问题确实只有拿出我做接合在另一个类例如

实体菜单joing上菜单项和我使用

的hasMany(X => x.MenuItems)。类(typeof运算(菜单))

回答

0

发现此问题: 即解决方案。

标识

的automapper被坚持己见,它期望被设计为以特定的方式你的类;如果它们不是,那么它将无法在没有一点帮助的情况下自动映射它们。 automapper期望你的身份被命名为Id,如果他们不是,它不会找到它们。

您可以通过在自动映射配置中重写IsId方法来修改自动映射器发现标识的方式。这个方法将会被你的实体中已经被ShouldMap(成员)标准接受的所有成员调用;无论哪个成员您返回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"); 
     } 
    }