2010-09-17 173 views
0

问题很简单我有功能NHibernate映射两类:流利的映射

public class A: EntityBase {} 
public class B: EntityBase 
{ 
    public virtual A A_Something {get;set;} 
} 

与EntityBase类只提供Key属性。现在我想映射它们并配置我的分贝。因此,这里有映射

public class AMap : DomainEntityBase<A> 
{ 
    public AMap(){} 
} 

public class BMap : DomainEntityBase<B> 
{ 
    public BMap() 
    { 
    References(p=>p.A_Something).Column("A_ID"); 
    } 
} 

和DB配置

Fluently.Configure().Database(...).Mappings(m => 
    m.FluentMappings.Add<BMap>()). 
    ExposeConfiguration(BuildSchema).BuildSessionFactory(); 

配置与BMAP仅处理遗憾的是表上已经存在数据库里面,它的数据不能被改变(这是因为这个应用程序是使用更大的数据库的部分和那些部分不会被修改)。所以这个模式产生的标准异常

An association from the table [B] refers to an unmapped class: A 

是否有可能以某种方式我的配置是一个已经存在的数据库内指定?如果不是,你有什么建议以温和的方式解决这个问题?当然,我可以准备* .sql文件来手动创建表B,但这不是一个解决方案(只是推开问题,因为在进一步开发过程中它肯定会回来)。还可以创建单独的数据库并从第一个数据库导入数据,但不幸的是需要将数据存储在一个(并且只有一个)数据库中。

回答

0

你必须对所有将要使用的实体地图;不管它们的对应表是否存在于数据库中都是不相关的。

只有当你在做架构生成莫非要不要紧,但你所要做的就是生成更新脚本,而不是创建脚本。鉴于数据库方言和连接,NHibernate将生成脚本来创建缺失的表并更新现有的表(如果有必要的话)(这听起来好像不是这种情况)。

如果现有的表的名称不匹配的实体(默认名称)的类型,则需要通过调用来指定在映射:

Table("ATable"); 
+0

和我的问题主要是如何给力nhibernate生成更新脚本而不是创建脚本。 – tchrikch 2010-09-17 14:09:25