如果我的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();
}
}
答案 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();
}
}