使用ColumnName的FluentNHibernate错误?

时间:2011-12-27 22:01:43

标签: nhibernate fluent-nhibernate

如果我的ClassMap包含引用(m => m.Store).Column(“StoreId”)并且我调用SchemaExport,那么我的数据库表包含两个外键列,一个名为' StoreId'和一个名为'Store_id'。

如果我离开Column()方法,那么它只会创建'Store_id'列。

这是FluentNHibernate框架中的错误吗? 我想只有'StoreId'栏。

提前致谢。

public class EntityMap<T> : ClassMap<T> where T : Entity
{
    public EntityMap()
    {
        Id( m => m.Id );
    }
}

public class StoreMap : EntityMap<Store>
{
    public StoreMap()
    {
        Map( m => m.Name );
        HasMany( m => m.Staff )
            .Inverse()
            .Cascade.All();
        HasManyToMany( m => m.Catalogue )
            .Table( "Store_Product" )
            .Cascade.All();
    }
}

public class EmployeeMap : EntityMap<Employee>
{
    public EmployeeMap()
    {
        Map( m => m.LastName );
        Map( m => m.FirstName );
        References( m => m.Store ).Column( "StoreId" );
    }
}

public class ProductMap : EntityMap<Product>
{
    public ProductMap()
    {
        Map( m => m.Name );
        HasManyToMany( m => m.Stores )
            .Table( "Store_Product" )
            .Inverse()
            .Cascade.All();
    }
}

2 个答案:

答案 0 :(得分:0)

这不是一个bug,如果默认情况下保留column()nhibernate认为你的外键是属性名+下划线+ id,你就是留下列nhhibernate获取你被映射的属性名称Store并合并到_id

您必须在StoreMap中为HasMany添加.KeyColumn(“StoreId”) 地图看起来像这样

public StoreMap()
{
    Map( m => m.Name );
    HasMany( m => m.Staff )
        .Inverse()
        .Cascade.All().KeyColumn("StoreId");
    HasManyToMany( m => m.Catalogue )
        .Table( "Store_Product" )
        .Cascade.All();
}

答案 1 :(得分:0)

现在找到了解决方案,虽然在我看的任何地方都没有描述。

您必须将列设置为双向。然后“Store_id”列消失。谢谢大家的答案!

对于我上面的例子:

public class EntityMap<T> : ClassMap<T> where T : Entity
{
    public EntityMap()
    {
        Id( m => m.Id );
    }
}

public class StoreMap : EntityMap<Store>
{
    public StoreMap()
    {
        Map( m => m.Name );
        HasMany( m => m.Staff )
            .KeyColumn( "StoreId" )
            .Inverse()
            .Cascade.All();
        HasManyToMany( m => m.Catalogue )
            .Table( "Store_Product" )
            .ParentKeyColumn( "StoreId" )
            .ChildKeyColumn( "ProductId" )
            .Cascade.All();
    }
}

public class EmployeeMap : EntityMap<Employee>
{
    public EmployeeMap()
    {
        Map( m => m.LastName );
        Map( m => m.FirstName );
        References( m => m.Store ).Column( "StoreId" );
    }
}

public class ProductMap : EntityMap<Product>
{
    public ProductMap()
    {
        Map( m => m.Name );
        HasManyToMany( m => m.Stores )
            .Table( "Store_Product" )
            .ParentKeyColumn( "ProductId" )
            .ChildKeyColumn( "StoreId" )
            .Inverse()
            .Cascade.All();
    }
}