我有一个包含Address作为值对象的person实体:
public Person()
{
WithTable("Person");
Id(x => x.Id);
Component<Address>(x => x.Address, a =>
{
a.Map(x => x.Address1);
a.Map(x => x.Address2);
a.Map(x => x.Address3);
a.Map(x => x.Town);
a.Map(x => x.Postcode);
});
}
Run Code Online (Sandbox Code Playgroud)
它在NHibernate文档中指出,如果值对象(Address1,Address2等)的所有属性都为null,则整个组件将被映射为null(即Person.Address将为null).这给了我所有地址字段为空的情况下的问题,因为在我的网页中我可能有(我正在做ASP MVC):
<%= Html.TextBoxFor((x => x.Address.Address1))%>
Run Code Online (Sandbox Code Playgroud)
这打破了空引用异常.所以我正在寻找一种简洁的方法将Address设置为一个新的Address()对象而不是null,如果我从数据库加载Person而不手动操作时所有字段都是空的.我打了以下想法:
在我的视图中进行空检查(yuk,可怕)
使数据库字段不可为空(我正在处理遗留数据库)
任何想法?
我有一个遗留数据库和两个表之间的一对一关系.关键是关系使用两列,而不是一列.有没有办法在nhibernate中说,当获取一个被引用的实体时,它在join语句中使用了两列,而不是一个?我有一个类似的表结构
TaskProgress
任务
每个任务都可以在不同的任务中进行分配.这意味着任务进度的唯一任务只能由AssignmentId和TaskId字段建立.
我想用这个:
References(x => x.Template)
.Columns()
.PropertyRef()
Run Code Online (Sandbox Code Playgroud)
但无法获得如何在多列上映射连接,任何想法?
Hl伙计们,
我正忙着为存在的系统编写后端管理程序.我已经为我的数据访问解决方案选择了NHibernate,并且它是相当新的.我在父/子关系中遇到以下错误:
NHibernate.StaleStateException:意外的行数:0; 预期:1
此错误是由于我的源代码中将新的子对象添加到父级的MeetingAdministrators子集合中.当我保存父对象时,我也希望添加子对象,但是只为父对象生成INSERT.Nhibernate不为子节点生成INSERT,而是尝试更新子节点,即使它不存在.因此,它会显示上面显示的错误消息.我已经浏览了网络上的各个地方和这个场景的nhibernate文档,但没有找到任何帮助.大多数代码涉及不属于主键的外键,或者人们似乎正在处理一对一或多对多关系.我需要指定映射和代码,以便在插入父项时,子项也会被插入.请帮忙.
我的数据结构如下:
会议 - 父表
MeetingAdministrator - 子表
这是Visual Basic .NET源代码:
<Serializable()> _
Public Class MeetingAdministrator
Private _MeetingID As Integer
Public Overridable Property MeetingID() As Integer
Get
Return _MeetingID
End Get
Set(ByVal value As Integer)
_MeetingID = value
End Set
End Property
Private _AdminNetworkID As String
Public Overridable Property AdminNetworkID() As String
Get
Return _AdminNetworkID
End Get
Set(ByVal value As String)
_AdminNetworkID = value
End Set
End …Run Code Online (Sandbox Code Playgroud) 我一直试图在Ayende的博客之后做一个非常简单的审计场景,这似乎是每个人在IPreUpdateEventListener和IPreInsertEventListener时所引用的资源.
然而,无论我怎么努力,我都无法让它发挥作用.事件正确启动,当我通过它时一切看起来都没问题,但是我的"更改时间"没有更新到数据库.
我花了大约一天google搜索这一点,并终于找到了答案在这里.
当您使用dynamic-update ="true"映射实体时,它将无法工作.果然,对我来说就是这样.既然我很难找到这条信息,那么使用dynamic-update ="true"是不常见的?我们在所有实体上使用它.
由于这对我们来说是一个重大障碍,我想问一下这有什么办法吗?
我一直在关注IInterceptor,但它总是被认为是过时的,那么这有什么缺点呢?另外,我还没有找到一个关于如何使用IInterceptor进行相同审计(使用插入/更新时间戳)的非常好的教程(我对NHibernate相当新).
任何帮助,将不胜感激!
我需要优化域实体上的保存(插入查询)生成的查询.我已经使用Fluent NHibernate配置了NHibernate.
这是NHibernate在插入用户对投票的响应时生成的查询:
exec sp_executesql N'INSERT INTO dbo.Response (ModifiedDate, IpAddress, CountryCode,
IsRemoteAddr, PollId) VALUES (@p0, @p1, @p2, @p3, @p4); select SCOPE_IDENTITY()',N'@p0
datetime,@p1 nvarchar(4000),@p2 nvarchar(4000),@p3 bit,@p4 int',
@p0='2001-07-08 03:59:05',@p1=N'127.0.0.1',@p2=N'US',@p3=1,@p4=2
Run Code Online (Sandbox Code Playgroud)
如果观察的输入参数IpAddress和CountryCode,将会注意到,NHibernate的使用nvarchar(4000).问题是,nvarchar(4000)远远大于我需要或者IpAddress或CountryCode并且由于高流量和托管的要求,我需要优化内存使用情况的数据库.
以下是这些列的Fluent NHibernate自动映射覆盖:
mapping.Map(x => x.IpAddress).CustomSqlType("varchar(15)");
mapping.Map(x => x.CountryCode).CustomSqlType("varchar(6)");
Run Code Online (Sandbox Code Playgroud)
这不是我看到不必要的nvarchar(4000)弹出的唯一地方.
如何控制NHibernatenvarchar(4000)对字符串表示的使用?
如何更改此insert语句以使用适当大小的输入参数?
sql-server nhibernate hibernate nhibernate-mapping fluent-nhibernate
我在NHibernate中有一个映射,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping namespace="News.BusinessEntity" assembly="News.BusinessEntity" xmlns="urn:nhibernate-mapping-2.2">
<class name="News" table="News">
<property name="NewsId" type="Int64" column="NewsId" />
<property name="NewsTitle" type="String" column="NewsTitle" />
</class>
<sql-query name="Sp_News">
<return class="News" />
exec Sp_News
</sql-query>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
当我打电话时,session.GetNamedQuery("Sp_News")我收到以下错误:
Named query not known: Sp_News.
Run Code Online (Sandbox Code Playgroud)
任何帮助将非常感激.
我在asp.net mvc3中使用Fluent Nhibernate与c#
我正在按照以下方式生成并映射一个类
制图
using FluentNHibernate.Mapping;
using Com.Web.Domain;
namespace Com.Web.Mapping
{
public class CompanyMap : ClassMap<Company>
{
public CompanyMap()
{
Id(x => x.id);
Map(x => x.Name);
}
}
}
Run Code Online (Sandbox Code Playgroud)
类
using System.Collections.Generic;
using System;
namespace Com.Web.Domain
{
public class Company
{
public virtual int id { get; set; }
public virtual string Name{get;set}
}
}
Run Code Online (Sandbox Code Playgroud)
并在配置文件中
private static void InitializeSessionFactory()
{
_sessionFactory = Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008
.ConnectionString(local)
)
.Mappings(m =>
m.FluentMappings
.AddFromAssemblyOf<Company>())
.ExposeConfiguration(cfg => new SchemaExport(cfg)
.Create(false, false)) // this …Run Code Online (Sandbox Code Playgroud) nhibernate asp.net-mvc nhibernate-mapping fluent-nhibernate fluent-nhibernate-mapping
我想按照这个教程,但不是与我在它映射产生预期的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)的行,这些行未映射到持久类.这些值在域中已弃用,因此为每个值创建持久类没有用.但我们也无法从数据库中删除它们.
有没有办法将这些额外的行映射到单个"默认"类?如果没有,我还能怎样解决这个问题?
谢谢!
我第一次使用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 ×9
.net ×1
asp.net-mvc ×1
c# ×1
database ×1
hbmxml ×1
hibernate ×1
inheritance ×1
null ×1
parent-child ×1
sql-server ×1