使用nhibernate时如何添加NOLOCK?(标准查询)
每当我加载Task类时,尽管db中有数据,Document属性始终为null.
任务类:
public class Task
{
public virtual Document Document { get; set; }
Run Code Online (Sandbox Code Playgroud)
AutoPersistenceModel的任务映射覆盖:
public void Override(AutoMap<Task> mapping)
{
mapping.HasOne(x => x.Document)
.WithForeignKey("Task_Id");
Run Code Online (Sandbox Code Playgroud)
正如你可以看到NHProf所说的那样,连接条件是错误的,WithForeignKey似乎没有生效.事实上,我可以在上面的代码中写任何字符串,它没有任何区别.
FROM [Task] this_
left outer join [Document] document2_
on this_.Id = document2_.Id
Run Code Online (Sandbox Code Playgroud)
它应该是:
FROM [Task] this_
left outer join [Document] document2_
on this_.Id = document2_.Task_Id
Run Code Online (Sandbox Code Playgroud)
如果我破解数据库中的数据以便id匹配,则加载数据,但显然这是不正确的 - 但至少证明它加载了数据.
编辑:在流利的nhib源中搜索,找到XML产生这个:
<one-to-one foreign-key="Task_Id" cascade="all" name="Document" class="MyProject.Document, MyProject, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
Run Code Online (Sandbox Code Playgroud)
编辑:继承人架构:
CREATE TABLE [dbo].[Document](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Task_Id] [int] NOT NULL,
CREATE TABLE [dbo].[Task]( …Run Code Online (Sandbox Code Playgroud) 是否可以通过FHN在代码中配置L2缓存提供程序?
在以下配置中添加一行是我所追求的:
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2005.ConnectionString(c => c.FromConnectionStringWithKey("Temp")).ShowSql())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<IMap>())
.ExposeConfiguration(c => { })
.BuildSessionFactory();
Run Code Online (Sandbox Code Playgroud)
干杯
AWC
然后我使用Fluent NHibernate及其自动化功能来映射以下简化的POCO类:
public class Foo
{
public virtual int Id { get; set; }
public virtual datetime CreatedDateTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
默认情况下,CreatedDateTime字段将映射到SQL DateTime.但是,如果我进行测试以检查实体是否正确创建,则会失败.这是因为DateTime字段的精度不会保留到SQL数据库.我强调这背后的原因是MS SQL Server DateTime只能通过四舍五入到.000,.003或.007的增量来保持毫秒精度(请参阅http://msdn.microsoft.com/en-us/library /ms187819.aspx).因此,NHibernate在保存到商店时会截断毫秒数.这导致我的测试失败,当检查正确持久的字段,因为我的.NET DateTime保持其毫秒,但在保存已经失去其毫秒之后重新启动DateTime,因此两者不是真正相等.
为了解决这个问题,我将以下映射添加到Foo对象:
public class FooMap : IAutoMappingOverride<Foo>
{
public void Override(AutoMapping<Foo> mapping)
{
mapping.Map(f => f.CreatedDateTime).CustomType("datetime2");
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这个映射使得NHibernate将CreatedDateTime持久化为datetime2的SQL类型,它可以存储.NET DateTime可以的完整精度.这是一种享受,现在测试通过了.
然而,一次传递另一个失败:我检查架构导出的测试现在失败,出现以下错误:
System.ArgumentException : Dialect does not support DbType.DateTime2
Parameter name: typecode
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪:
at NHibernate.Dialect.TypeNames.Get(DbType typecode)
at NHibernate.Dialect.Dialect.GetTypeName(SqlType sqlType)
at NHibernate.Mapping.Column.GetDialectTypeName(Dialect dialect, IMapping mapping)
at NHibernate.Mapping.Table.SqlCreateString(Dialect dialect, IMapping p, String …Run Code Online (Sandbox Code Playgroud) 我有一个要求加载一个名为Node的复杂对象...它不是那么复杂...它看起来如下: -
一个节点有一个参考的EntityType具有一对多与物业这反过来有一对多与PorpertyListValue
public class Node
{
public virtual int Id
{
get;
set;
}
public virtual string Name
{
get;
set;
}
public virtual EntityType Etype
{
get;
set;
}
}
public class EntityType
{
public virtual int Id
{
get;
set;
}
public virtual string Name
{
get;
set;
}
public virtual IList<Property> Properties
{
get;
protected set;
}
public EntityType()
{
Properties = new …Run Code Online (Sandbox Code Playgroud) 我已经使用Nhibernate 2.1从Fluent Nhibernate 1.0升级到使用NHibernate 3.0 GA预发布1.x并且达到了我认为的回归,但我想知道是否确实如此.
我使用的是SQL Server Express 2008和MSSQL 2008方言,并且具有System.Drawing.Image类型的Image属性,我已将其映射为:
Map (food => food.Image)
.Length (int.MaxValue)
.Nullable ();
Run Code Online (Sandbox Code Playgroud)
Image表中的列是类型varbinary(MAX).
生成的属性的hbm是:
<property name="Image" type="System.Drawing.Image, System.Drawing,
Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<column name="Image" length="2147483647" not-null="false" />
</property>`
Run Code Online (Sandbox Code Playgroud)
但是无论我做什么,当使用当前的FNH和NH版本序列化时,二进制blob被截断为8000字节.以前的版本不是这种情况.
想法为什么会这样,以及如何解决/解决它?
我用过这个如何使用流畅的NHibernate将枚举映射为int值?在过去映射,但我最近升级到NHibernate 3,这似乎不再起作用了.我在我的EnumConvention课程中放了断点,但它们没有被击中.命中数据库的查询将枚举作为字符串,这是默认配置.
这如何与NHibernate 3一起使用?
更新
以下是生成的映射文件的一部分:
<property name="ComponentType" type="FluentNHibernate.Mapping.GenericEnumMapper`1[[...ComponentType, ..., Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], FluentNHibernate, Version=1.1.0.0, Culture=neutral, PublicKeyToken=8aa435e3cb308880">
<column name="ComponentTypeId" />
</property>
Run Code Online (Sandbox Code Playgroud)
如果为枚举指定了GenericEnumMapper何时使用它似乎是正确的IUserTypeConvention.
这是我的惯例:
public class EnumConvention : IUserTypeConvention
{
public void Accept( IAcceptanceCriteria<IPropertyInspector> criteria )
{
criteria.Expect( e => e.Property.PropertyType.IsEnum );
}
public void Apply( IPropertyInstance instance )
{
instance.CustomType( instance.Property.PropertyType );
}
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Fluent NHibernate并且遇到一些问题,我可以通过其中一个类来设置多对多的关系.这可能是一个愚蠢的错误,但我已经陷入了一点点试图让它运作.无论如何,我有几个有很多关系的课程.
public class Person
{
public Person()
{
GroupsOwned = new List<Groups>();
}
public virtual IList<Groups> GroupsOwned { get; set; }
}
public class Groups
{
public Groups()
{
Admins= new List<Person>();
}
public virtual IList<Person> Admins{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
映射看起来像这样
人:......
HasManyToMany<Groups>(x => x.GroupsOwned)
.WithTableName("GroupAdministrators")
.WithParentKeyColumn("PersonID")
.WithChildKeyColumn("GroupID")
.Cascade.SaveUpdate();
Run Code Online (Sandbox Code Playgroud)
团体:......
HasManyToMany<Person>(x => x.Admins)
.WithTableName("GroupAdministrators")
.WithParentKeyColumn("GroupID")
.WithChildKeyColumn("PersonID")
.Cascade.SaveUpdate();
Run Code Online (Sandbox Code Playgroud)
当我运行集成测试时,基本上我正在创建一个新的人和组.将组添加到Person.GroupsOwned.如果我从存储库中获取Person对象,则GroupsOwned等于初始组,但是,当我检查Group.Admins上的计数时,如果我返回组,则计数为0. Join表具有GroupID和PersonID保存在其中.
感谢您的任何建议.
我试图将我的模型中的枚举属性(System.DayOfWeek的实例)映射到整数数据库字段.模型中的其他枚举属性应该映射到字符串,所以我不希望定义约定.
我知道这应该可以使用流畅的映射,如:
Map(x => x.DayOfWeek).CustomType<int>();
Run Code Online (Sandbox Code Playgroud)
事实上,乍一看这似乎有效.
但是,我注意到每次刷新会话时都会更新具有以这种方式映射的属性的实体实例,即使没有对它们进行任何修改.
为了找出导致此刷新的原因,我设置了一个IPreUpdateEventListener,并检查了该实体的OldState和State.请参见附图.在OldState中,相关对象是int,而在State中它是DayOfWeek.
如果我使用未指定类型属性的HBM XML映射,则不会出现此问题.
所以...
这是GenericEnumMapper中的错误还是缺点?有没有办法告诉FNH映射不要在生成的HBM上指定任何类型属性?如果没有,我可以指定NH用于枚举的默认类型(以及那是什么)?

在项目中升级NHibernate和FluentNHibernate DLL后,我现在在初始化SessionFactory时遇到"无法确定:MyApp.Domain.Entities.AppCategory的类型"异常.我的代码中唯一的变化是调整ForeignKeyConvention的实现来覆盖GetKeyName ( Member member, Type type )抽象方法,而不是GetKeyName ( PropertyInfo property, Type type ).
对于FluentNHibernate,升级的DLL从1.0.0.593到1.1.0.685,对于NHibernate,升级的DLL从2.1.0.4000到2.1.2.4000.寻找解决方案的部分困难是我们正在使用的NHibernate版本的旧时代,但至少目前还无法改变.
我在下面发布了完整的例外和所有相关的代码和配置.我为这个长度道歉,但我不知道问题可能在哪里.
完全例外
FluentNHibernate.Cfg.FluentConfigurationException : An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
----> FluentNHibernate.Cfg.FluentConfigurationException : An invalid or incomplete configuration was used while creating a SessionFactory. Check PotentialReasons collection, and InnerException for more detail.
----> NHibernate.MappingException : Could not compile the mapping document: (XmlDocument)
----> NHibernate.MappingException : Could not determine …Run Code Online (Sandbox Code Playgroud) nhibernate ×8
c# ×2
automapping ×1
caching ×1
criteria ×1
datetime ×1
fluent ×1
granularity ×1
timestamp ×1
velocity ×1