我正在使用asp.net业务应用程序并使用nhibernate。我使用nhibernate的目的是最小化/避免不同数据库(Oracle,SQL Server,Postgres等)上的应用程序移植工作。
我有一个场景,我必须动态检查数据库表模式并在其上构建一些功能。我想到的第一件事就是创建存储过程并将其移植到不同的数据库中。我的存储过程看起来像这样......
SELECT COLUMN_NAME, DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = (
SELECT MasterTableName FROM SystemDocument WHERE DocId = @vDocumentID
)
现在我有2个问题......
1- NHibernate中是否有任何替代方法可以通过避免存储过程来实现这一目标?
2-如果第一个问题的回答是NO :(那我怎么能填写一个dto / POCO,它可以包含列和它们的表类型而不用nhibernate映射?
我将非常感谢你对此提出的建议。
谢谢, 阿西
答案 0 :(得分:0)
您可以使用常规sql并将其投影到dto对象上。我使用命名查询,因此更容易更改。我不知道是否有办法根据当前使用的方言自动映射这些命名查询。
答案 1 :(得分:0)
在C#中,您可以使用以下代码在Startup.cs
文件中实现此目的:
// Append database schema for update
schemaHelper.AppendDatabaseUpdateSql(Assembly.GetExecutingAssembly(), sessionFactoryHelper.GetConfiguration(hibernateCfgPath));
// Append database schema for creation
schemaHelper.AppendDatabaseCreationSql(Assembly.GetExecutingAssembly(), sessionFactoryHelper.GetConfiguration(hibernateCfgPath));
这些会从您的映射中创建正确的数据库表。
否则请参阅this post了解其他解决方案。
希望有所帮助: - )