现有表和新表之间的流畅映射

时间:2010-09-17 09:43:10

标签: c# fluent-nhibernate nhibernate-mapping

问题很简单我有两个用流利的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进行配置,因为遗憾的是,表A已存在于数据库内,并且无法更改数据(因为此应用程序正在使用较大数据库的一部分而这些部分不会被修改)。所以这个模式生成标准异常

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

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

1 个答案:

答案 0 :(得分:0)

您必须映射您将使用的所有实体;数据库中是否存在相应的表是无关紧要的。

只有在进行模式生成时才重要,但您所要做的就是生成更新脚本而不是创建脚本。鉴于数据库方言和连接,NHibernate将生成脚本以创建缺失的表并更新现有表(如果需要的话)(听起来它不是在这种情况下)。

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

Table("ATable");