NHibernate - 是不是有生成 POCO 的工具?

Posted

技术标签:

【中文标题】NHibernate - 是不是有生成 POCO 的工具?【英文标题】:NHibernate - is there a tool to generate POCOs?NHibernate - 是否有生成 POCO 的工具? 【发布时间】:2013-08-01 10:37:06 【问题描述】:

我正在研究使用 NHibernate,一切看起来都不错。有没有可以用来从当前数据库生成 POCO 的工具?这将加快开发人员的时间,而不是创建它们。

【问题讨论】:

【参考方案1】:

NHibernate 映射生成器项目 (http://nmg.codeplex.com/) 可以创建实体类和所有形式的映射(XML、fluent nhibernate 等)。

【讨论】:

【参考方案2】:

Entity Framework Power Tools 可以从数据库为您生成 POCO。有关一些信息,请参阅this article。不过,您可能需要稍微调整一下流程;稍作调整就能产生非常好的结果:

如果一切都对齐,那么我们根本不会生成任何映射:

当然,如果所有内容都不一致,那么您将应用实体框架特定的属性,您需要将其删除。但是你仍然会有一个很好的起点。

个人意见警告!另一种可能性是简单地保留属性并使用实体框架。如果您大量使用 LINQ,我会推荐它。我发现 NHibernate 的 LINQ 提供程序在大多数情况下都能正常工作,但会因 1) 极其微不足道的 LINQ 表达式和 2) 极其复杂的 LINQ 表达式而崩溃。 但是ta.speot.is!它一直在变得更好!各有特色,但现在实体框架的 LINQ 提供程序非常一致。

【讨论】:

【参考方案3】:

这是一个用于创建 poco 和 map 的快速 SQL 脚本。根据需要随意调整。

    begin

    declare @tablename varchar(200)
    set @tablename = 'tablename'

    declare @outputTable table ( id int identity(1,1), rowType varchar(4), outputString varchar(5000))
    declare @columnname varchar(200)
    declare @isNullable bit
    declare @xtype tinyint
    declare @xtypeString varchar(200)
    declare @outputString varchar(5000)

    declare c1 cursor for 
        select name, isnullable, xtype from syscolumns
            where id in (select id  from sysobjects where name = @tablename)
            order by colorder

    open c1

    set @outputString = 'Table("' +  Upper(@tablename) + '");'

    insert into @outputTable (rowType, outputString) values('map',@outputString)

    fetch next from c1 into @columnName, @isNullable, @xtype
    while(@@FETCH_STATUS=0)
    begin

    print @columnname
    print @isnullable
    print @xtype

    set @outputString = ''
    set @xtypeString = ''

    if (@xtype = 104)
        set @xtypeString = 'bool'

    if (@xtype = 60)
        set @xtypeString = 'double'

    if (@xtype = 62)
        set @xtypeString = 'double'

    if (@xtype = 175)
        set @xtypeString = 'string'

    if (@xtype = 56)
        set @xtypeString = 'int'

    if (@xtype = 48)
        set @xtypeString = 'int'

    if (@xtype = 167)
        set @xtypeString = 'string'

    if (@xtype = 61)
        set @xtypeString = 'DateTime'

    if (@isnullable = 1 and len(@xtypeString) > 0 and @xtypeString <> 'string') 
        set @xtypeString = @xtypeString + '?'

    if @xtypeString=''
        set @xtypeString = cast(@xtype as varchar)

    set @outputString = 'public virtual ' + @xtypeString + '   ' +  @columnName + '  get;set;          //  ' + @columnname

    insert into @outputTable (rowType, outputString)    values('poco', @outputString)

    set @outputString = 'Map(x => x.'+ @columnname+').Column("' + @columnname+'");'

    insert into @outputTable (rowType, outputString)    values('map', @outputString)


    fetch next from c1 into @columnName, @isNullable, @xtype
    end

    close c1
    deallocate c1

    select * from @outputTable where rowType = 'poco' order by id 
    select * from @outputTable where rowType = 'map' order by id 
end

【讨论】:

以上是关于NHibernate - 是不是有生成 POCO 的工具?的主要内容,如果未能解决你的问题,请参考以下文章

nHibernate 生成了这个奇怪的 SQL; SQLS 是不是按原样使用它?

有啥理由将 POCO 变成 Model 对象?

NHibernate Cascade none 仍在更新相关实体

Fluent NHibernate 的类映射生成器

Fluent NHibernate 多对多映射,使用自动生成的 pk 而不是复合键

Fluent NHibernate 忽略 ClassMap 中的属性,使用 FluentMappings