C# 如何从域逻辑生成NHibernate映射文件和DB构造?

C# 如何从域逻辑生成NHibernate映射文件和DB构造?,c#,database,nhibernate,nhibernate-mapping,C#,Database,Nhibernate,Nhibernate Mapping,我想在我的项目中的域对象上实现NHibernate,但我不确定应该如何生成映射文件和数据库 我发现了一些与此相关的问题,但我从已经定义的类开始,并希望从它们开始,逐步深入,而不是相反 有没有办法做到这一点 我对一个多阶段的过程非常满意,我只想知道其他人做了哪些成功的事情 仅供参考,我想在SQL Server 2005上部署数据库。我喜欢。有关映射用户类的信息,请参见下面的示例,当然您可以使用XML lamda表达式中的x值表示域类 这非常像RoR,我非常喜欢 public sealed clas

我想在我的项目中的域对象上实现NHibernate,但我不确定应该如何生成映射文件和数据库

我发现了一些与此相关的问题,但我从已经定义的类开始,并希望从它们开始,逐步深入,而不是相反

有没有办法做到这一点

我对一个多阶段的过程非常满意,我只想知道其他人做了哪些成功的事情

仅供参考,我想在SQL Server 2005上部署数据库。

我喜欢。有关映射用户类的信息,请参见下面的示例,当然您可以使用XML

lamda表达式中的x值表示域类

这非常像RoR,我非常喜欢

public sealed class UserMap : ClassMap<User>, IMapGenerator
    {
        public UserMap()
        { 
            Id(x => x.Id)
                .WithUnsavedValue(0);
            Map(x => x.Username).TheColumnNameIs("UserName");
            Map(x => x.Password).TheColumnNameIs("Password");   
            Map(x => x.Salt).ReadOnly();

            Map(x => x.CreatedOn).ReadOnly();
            Map(x => x.CreatedBy).ReadOnly();
            Map(x => x.CreatedAt).ReadOnly();

            Map(x => x.ApprovalStatus)
                .TheColumnNameIs("ApprovalStatusId")
                .CustomTypeIs(typeof(ApprovalStatus));

            Map(x => x.DeletionStatus)
                .TheColumnNameIs("DeletionStatusId")
                .CustomTypeIs(typeof(DeletionStatus));

            References(x => x.Role).Not.Nullable();
            References(x => x.Contact);

        }

        #region IMapGenerator Members

        public System.Xml.XmlDocument Generate()
        {
            return CreateMapping(new MappingVisitor());
        }

        #endregion
    }
公共密封类UserMap:ClassMap,IMapGenerator
{
公共用户映射()
{ 
Id(x=>x.Id)
.具有未保存的值(0);
Map(x=>x.Username);
映射(x=>x.Password);
Map(x=>x.Salt).ReadOnly();
Map(x=>x.CreatedOn).ReadOnly();
Map(x=>x.CreatedBy).ReadOnly();
Map(x=>x.CreatedAt.ReadOnly();
地图(x=>x.ApprovalStatus)
.列名称为(“ApprovalStatusId”)
.CustomTypeIs(typeof(ApprovalStatus));
映射(x=>x.DeletionStatus)
.列名称为(“删除状态ID”)
.CustomTypeIs(typeof(DeletionStatus));
引用(x=>x.Role).Not.Nullable();
参考文献(x=>x.Contact);
}
#区域IMAPGGenerator成员
public System.Xml.XmlDocument Generate()
{
返回CreateMapping(newMappingVisitor());
}
#端区
}
关于映射: 您可以像Gary一样使用Fluent映射创建映射。 当您有一个非常简单的域模型时,您可以使用Automapping,这是FluentNhibernate基于约定的映射功能:

 var sessionFactory = Fluently.Configure()  
   .Database(MsSqlConfiguration.MsSql2005  
     .ConnectionString(c => c  
       .Is(ApplicationConnectionString)))  
   .Mappings(m =>  
     m.AutoMappings.Add(AutoPersistenceModel.MapEntitiesFromAssemblyOf<Product>())  
   )  
   .BuildSessionFactory();

+1表示流利。我以前读过这方面的文章。但是,我想知道,如果Fluent中包含了NHibernate的所有功能,或者说它是否明显落后于Fluent?另一个问题是,考虑到Fluent的使用,您将如何生成数据库?Fluent只解决映射问题。我在兼容性或功能集方面没有问题。Paco回答了生成问题,请告诉我您是否还有其他问题。当您说“不复杂”域模型时,您是否有关于这到底意味着什么的指标?比如说,只有1级的深层关系?没有循环引用?感谢SchemaExport的想法,这正是我在数据库构建方面所寻找的。你可以有循环引用,但你不会支持传统的db模式、用户类型、sql公式映射以及“手动”fluent nhibernate中支持的许多其他选项。自动映射是在绿地应用程序中从持久性快速开始的一个选项,但当您的应用程序增长或从其他人继承应用程序时,您可能希望更具体地描述您的映射,并使用“手动”fluent nhibernate,甚至hbm.xml
var schemaExport = new SchemaExport(configuration);
schemaExport.Create(false,true);