【问题标题】: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");
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      • 2011-10-22
      • 2011-04-10
      相关资源
      最近更新 更多