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; }
}
。。。其中classUser
已经是数据库中的现有表。现在,我想将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来适应现有数据。