【问题标题】:Working with legacy databases and SchemaAction in Fluent NHibernate在 Fluent NHibernate 中使用遗留数据库和 SchemaAction
【发布时间】:2012-12-18 17:06:24
【问题描述】:

我有两个班级:

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; }
}

... 其中User 类已经是数据库中的现有表。现在,我想将Report 作为一个表添加到数据库中,为此我计划使用 Fluent NHibernate。我正在映射UserReport,因为我希望User 可以从Report 类访问。 UserReport 之间存在一对多的关系。

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

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

如果我只是不指定 SchemaAction,则会创建表 UserReport,并生成 Report 中的外键。

【问题讨论】:

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

标签: c# nhibernate fluent-nhibernate


【解决方案1】:
  1. 将旧的/现有架构复制到新数据库中
  2. 使用您的映射和现有数据库创建 NHibernate 配置
  3. 使用此代码将更新脚本写入文件

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    相关资源
    最近更新 更多