C# 在Fluent NHibernate中使用遗留数据库和SchemaAction

C# 在Fluent NHibernate中使用遗留数据库和SchemaAction,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我有两门课: public class User { public virtual int Id { get; set; } public virtual string Name { get; set; } } public class Report { public virtual int Id { get; set; } public virtual string Name { get; set; } public virtual User User { get; se

我有两门课:

public class User
{
  public virtual int Id { get; set; }
  public virtual string Name { get; set; }
}

public class Report
{
  public virtual int Id { get; set; }
  public virtual string Name { get; set; }
  public virtual User User { get; set; }
}
。。。其中class
User
已经是数据库中的现有表。现在,我想将
Report
作为一个表添加到数据库中,为此我计划使用Fluent-NHibernate。我正在映射
User
Report
,因为我希望
User
可以从
Report
类访问。
用户
报告
之间存在一对多关系

我已经有了将SQL脚本导出到数据库的测试,其中包括
User
。现在我还想导出FNH生成的脚本,但我不希望FNH生成
User
,因为它已经在数据库中了

因此,我可以在
User
的映射中指定
SchemaAction.None()。这使得FNH不为
用户
生成脚本,只为
结果
生成脚本。唯一的问题是,在表
报告中没有生成外键。如何使FNH不导出为
用户生成的脚本
,但仍然导出表
报告的外键

如果我只是不指定SchemaAction,那么将创建表
User
Report
,并生成
Report
中的外键

  • 将旧/现有架构复制到新数据库中
  • 使用映射和现有数据库创建NHibernate配置
  • 使用此代码将更新脚本写入文件

    using (var file = new StreamWriter("SchemaUpdateScript.txt"))
    {
        new SchemaUpdate(config).Execute(file.WriteLine, false);
    }
    
  • 仔细检查更新脚本是否真的符合您的要求


  • 第1点。是可选的。我强烈建议不要在生产环境中直接使用SchemaUpdate。

    这不是一个确切的答案,但为什么要使用两种不同的方法来创建完整的模式?为什么不简单地添加到现有机制中呢?现有机制是手工创建的表脚本。查询数据库是通过手动创建的存储过程进行的。不用说,随着当前机制一起实现NHibernate将在将来节省时间。我非常使用NHibernate。但到目前为止,我从未在生产场景中使用SchemaExport,因为我发现在修改模式时,通常需要额外的特殊SQL来适应现有数据。