以下是域模型类:
public abstract class BaseClass
{
...
}
public class ChildClass : BaseClass
{
...
}
Run Code Online (Sandbox Code Playgroud)
请注意,父类是抽象的,这就是在使用流畅的nhibernate进行映射时给我带来一些困难的原因.我的鉴别器是一个字节(数据库中的tinyint).因为它不是一个字符串,我不能管理设置在基类中的鉴别值,这并不工作(从映射类BaseClass的拍摄):
DiscriminateSubClassesOnColumn<byte>("Type")
.SubClass<ChildClass>()
.IsIdentifiedBy((byte)OperationType.Plan)
.MapSubClassColumns(p => { ... })
Run Code Online (Sandbox Code Playgroud)
我得到的错误信息是:
类初始化方法UnitTest1.MyClassInitialize引发异常.NHibernate.MappingException:NHibernate.MappingException:无法格式鉴别价值实体的BaseClass的SQL字符串---> System.FormatException:输入字符串的不正确的格式..
以下帖子似乎解释了会发生什么.他们给使用XML的解决方案,但不与功能NHibernate:http://forum.hibernate.org/viewtopic.php?t=974225
谢谢您的帮助.
c# nhibernate domain-driven-design nhibernate-mapping fluent-nhibernate
我目前正在为我的课程使用hilo id生成器,但刚刚使用了最少的设置,例如
<class name="ClassA">
<id name="Id" column="id" unsaved-value="0">
<generator class="hilo" />
</id>
...
但是我真的要为NHibernate指定一个新列来使用foreach实体并为它提供最大值吗?
<class name="ClassA">
<id name="Id" column="id" unsaved-value="0">
<generator class="hilo">
<param name="table">hibernate_unique_key</param>
<param name="column">classA_nexthi</param>
<param name="max_lo">20</param>
</generator>
</id>
...
<class name="ClassB">
<id name="Id" column="id" unsaved-value="0">
<generator class="hilo">
<param name="table">hibernate_unique_key</param>
<param name="column">classB_nexthi</param>
<param name="max_lo">20</param>
</generator>
</id>
...
Run Code Online (Sandbox Code Playgroud)
另外我注意到,当我执行上述操作时,SchemaExport将不会创建所有列 - 只有classB_nexthi,还有其他我做错了.
我的SQL Server 2008数据库中有一个包含时间列的表.
我想要映射到的对象的属性是TimeSpan.
我如何告诉FluentNHibernate使用TimeAsTimeSpan NHibernate类型,以便我没有演员问题?
nhibernate nhibernate-mapping fluent-nhibernate sql-server-2008
我的项目需要处理三个数据库,这意味着三个会话工厂.问题是如果我用流利的nhibernate做这样的事情:
.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()))
Run Code Online (Sandbox Code Playgroud)
工厂将获取所有映射,甚至是与另一个数据库相对应的映射
我已经看到,当使用自动化时,您可以执行类似的操作,并按命名空间过滤:
.Mappings(m => m.AutoMappings.Add(
AutoMap
.AssemblyOf<Product>()
.Where(t => t.Namespace == "Storefront.Entities")))
Run Code Online (Sandbox Code Playgroud)
我没有找到这样的流利映射,是否有可能?我能想到的唯一解决方案是:为每个db映射类创建单独的程序集,或者将每个实体显式添加到工厂配置中.
如果可能的话,我宁愿避免这两种情况.谢谢.
我试图在NHibernate中映射一个实体,它应该有一个更新的列.这应该是实体最后写入数据库(创建或更新)时的DateTime.我希望NHibernate能够控制列的更新,所以我不需要记得在更新之前将属性设置为当前时间.
NHibernate中是否有内置功能,可以为我处理这个问题?
我想按照这个教程,但不是与我在它映射产生预期的hbm.xml文件中为我的实体,如例如产生简单的.cs类:
public class ProductMap : ClassMap<Product>
Run Code Online (Sandbox Code Playgroud)
但我已经在代码中定义了这些.我正在使用.hbm.xml,我现在可以在标准NHibernate中使用它.
这就是我设置SessionFactory的方法:
private static ISessionFactory CreateSessionFactory()
{
String schemaExportPath = Path.Combine(System.Environment.CurrentDirectory, "Mappings");
if (!Directory.Exists(schemaExportPath))
Directory.CreateDirectory(schemaExportPath);
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(c =>c.FromConnectionStringWithKey("connectionString"))
.Cache(c => c.UseQueryCache()
.ProviderClass<HashtableCacheProvider>()).ShowSql())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Program>().ExportTo(schemaExportPath))
.ExposeConfiguration(c => new SchemaExport(c).SetOutputFile(@"c:\temp\test.sql").Create(false, true))
.BuildSessionFactory();
}
Run Code Online (Sandbox Code Playgroud) 我有一个包含数据的现有RoleType表.我试图使用每个类层次结构的表在NHibernate中映射此表:
<class name="IRoleType" table="RoleType">
<id name="Id" column="RoleID">
<generator class="native" />
</id>
<discriminator column="RoleID" />
<property name="Description" column="Description" />
<!-- ... more properties ... -->
<subclass name="RoleA" discriminator-value="1" />
<subclass name="RoleB" discriminator-value="4" />
<subclass name="RoleC" discriminator-value="7" />
</class>
Run Code Online (Sandbox Code Playgroud)
这里,IRoleType是一个接口,具有实现者RoleA,RoleB和RoleC.这有效.但这是问题 -
该表包含具有"额外"鉴别器值(2,3,5,6)的行,这些行未映射到持久类.这些值在域中已弃用,因此为每个值创建持久类没有用.但我们也无法从数据库中删除它们.
有没有办法将这些额外的行映射到单个"默认"类?如果没有,我还能怎样解决这个问题?
谢谢!
我正在尝试将表从多对一映射切换为具有中间映射表的多对多映射.但是,当我切换它并试图用NHibernate对它进行查询时,它给了我这个错误:"Interceptor.OnPrepareStatement(SqlString)返回null或空SqlString."
我的查询最初是一些更复杂的问题,但是我将其切换为基本的提取全部并且我仍然遇到问题:
Session.QueryOver<T>().Future();
Run Code Online (Sandbox Code Playgroud)
它似乎是我的模型映射文件中的问题或我的数据库中的某些东西.
这是我的模型映射:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="GBI.Core" namespace="GBI.Core.Models">
<class name="Market" table="gbi_Market">
<id name="Id" column="MarketId">
<generator class="identity" />
</id>
<property name="Name" />
<property name="Url" />
<property name="Description" type="StringClob" />
<property name="Rating" />
<property name="RatingComment" />
<property name="RatingCommentedOn" />
<many-to-one name="RatingCommentedBy" column="RatingCommentedBy" lazy="proxy"></many-to-one>
<property name="ImageFilename" />
<property name="CreatedOn" />
<property name="ModifiedOn" />
<property name="IsDeleted" />
<many-to-one name="CreatedBy" column="CreatedBy" lazy="proxy"></many-to-one>
<many-to-one name="ModifiedBy" column="ModifiedBy" lazy="proxy"></many-to-one>
<set name="Content" where="IsDeleted=0 and ParentContentId is NULL" order-by="Ordering asc, CreatedOn asc, Name asc" lazy="extra"> …Run Code Online (Sandbox Code Playgroud) 我第一次使用FluentNHibernate,尝试将类映射到SQL Express数据库.通常它可以工作,但我无法将Double或Decimal属性类型映射到特定的比例/精度.下面显示了我使用SchemaUpdate.Execute反复测试的单个属性的结果.在任何情况下我都无法让它发挥作用.
听到一些不符合我预期的映射的解释(2-8)真的很有帮助吗?
// Ok mappings:
Run Code Online (Sandbox Code Playgroud)
1)十进制:映射(函数(x)x.Balance)>>十进制(19,5 )
// Mappings "errors":
Run Code Online (Sandbox Code Playgroud)
2)Double:Map(Function(x)x.Balance).CustomSqlType("decimal") >> Decimal(18,0) - 为什么0 precision是这里的默认映射?
3)Double:Map(Function(x)x.Balance)>> Float,但是; 在运行SchemaValidator之后: HibernateException:FnhDb.dbo.Account中的列类型错误,用于列Balance.发现:浮动,预期双精度
4)十进制:映射(函数(x)x.Balance).Scale(9).精度(2) >> SqlException:列'Balance'的标度(9)必须在0到2的范围内.
5,6)十进制或双数:映射(函数(x)x.Balance).Scale(9).精度(2).CustomSqlType("numeric") >> numeric(18,0)
7,8)十进制或双精度:映射(函数(x)x.Balance).Scale(9).精度(2).CustomSqlType("decimal") >>十进制(18,0)
编辑: 我在这里包含代码和案例(4)的hbm.xml(导出):
Public Class AccountMap
Inherits ClassMap(Of Account)
Public Sub New()
MyBase.New()
Id(Function(x) x.Id).GeneratedBy.Identity()
Map(Function(x) x.Balance).Scale(9).Precision(2)
Map(Function(x) x.Deposits)
Map(Function(x) x.WithDrawals)
End Sub
End Class
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" …Run Code Online (Sandbox Code Playgroud) .net database nhibernate nhibernate-mapping fluent-nhibernate
我有一个NHibernate实现的项目并使用Lazy Loading.我在这个项目中有两个班:人和家庭.这两者之间的关系是聚合,是指Person有一个Person列表.映射是:
<class name="Person" table="Person_Person" >
<id name="Id" type="Int64" unsaved-value="0">
<generator class="native" />
</id>
<bag name="Families" inverse="true" table="Person_Family" cascade="all-delete-orphan" >
<key column="Person_id_fk"/>
<one-to-many class="Domain.Entities.Family,Domain.Entities"/>
</bag>
</class>
Run Code Online (Sandbox Code Playgroud)
在这个项目中,我通过ID获取一个人然后删除一个家庭的人.
Person person = SessionInstance.Get<Person>(id);
foreach (Family fam in person.Families)
if (fam.Name == "Jaun")
SessionInstance.Delete(fam);
Run Code Online (Sandbox Code Playgroud)
系列未删除,因为通过此消息抛出异常:
deleted object would be re-saved by cascade (remove deleted object from associations)[Domain.Entities.Family#167]
我怎样才能删除一个人的家庭?
nhibernate ×10
.net ×2
c# ×2
cascade ×1
database ×1
hbmxml ×1
hilo ×1
inheritance ×1
interceptor ×1