我有以下映射定义:
<class name="Role" table="Role" optimistic-lock="version" >
<id name="Id" type="Int32" unsaved-value="0" >
<generator class="native" />
</id>
<property name="RoleName" type="String(40)" not-null="true" />
<bag name="UsersInRole" generic="true" lazy="true" cascade="all" table="UserRoles" >
<key column="RoleId" />
<many-to-many column="UserId" class="SystemUser, Domain"/>
</bag>
Run Code Online (Sandbox Code Playgroud)
和
<id name="Id" type="Int32" unsaved-value="0" >
<generator class="native" />
</id>
<property name="UserName" type="String(40)" not-null="true" unique="true" />
Run Code Online (Sandbox Code Playgroud)
此映射生成映射表UserRoles,它有两列 - RoleId和UserId.
但是,我想为该关系添加额外的属性 - 即一些枚举值定义关系的状态以及有效的开始和结束日期.
是否可以在nhibernate中执行或者我是否需要在此处添加其他类并将关系m-to-m更改为2个关系[user] 1-to-m [user_role] m-to-1 [role]?
将此示例视为基本示例,我创建了应用程序,但是当我执行此应用程序时,我收到以下错误.
未配置ProxyFactoryFactory.使用一个可用的NHibernate.ByteCode提供程序初始化session-factory配置节的'proxyfactory.factory_class'属性.示例:NHibernate.ByteCode.LinFu.ProxyFactoryFactory,NHibernate.ByteCode.LinFu示例:NHibernate.ByteCode.Castle.ProxyFactoryFactory,NHibernate.ByteCode.Castle
以下是我正在使用的代码段.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using NHibernate;
using NHibernate.Cfg;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Configuration cfg = new Configuration();
cfg.AddAssembly("NHibernate");
ISessionFactory factory = cfg.BuildSessionFactory();
ISession session = factory.OpenSession();
ITransaction transaction = session.BeginTransaction();
User newUser = new User();
newUser.Id = "joe_cool";
newUser.UserName = "Joseph Cool";
newUser.Password = "abc123";
newUser.EmailAddress = "joe@cool.com";
newUser.LastLogon = DateTime.Now;
// Tell NHibernate that this object should be …Run Code Online (Sandbox Code Playgroud) asp.net nhibernate nhibernate-mapping nhibernate.search proxyfactory
我收到了错误
非法访问加载集合
当我想要获得属于某个产品的变种列表时.NHibernate映射如下
<list name="Variants" lazy="false" cascade="save-update" inverse="false" table="PluginProduct_ProductVariant">
<key column="ProductId" />
<index column="Ordinal" />
<one-to-many class="Plugin.Product.Business.Entities.Variant, Plugin.Product" />
</list>
Run Code Online (Sandbox Code Playgroud)
我已经尝试过按照本网站其他主题的建议来调整懒惰和反向属性,但他们没有做到这一点.
我正在将NHibernate与ASP.NET MVC结合使用,并且我试图在我的视图中循环遍历一个变体集合.视图调用以下方法
public ActionResult ShowProduct()
{
var id = new Guid(PluginData.PageParameters["Id"]);
var variant = _variantService.GetVariantById(id);
var product = variant.Product;
return PluginView("ShowProduct.ascx", product);
}
Run Code Online (Sandbox Code Playgroud)
上面的代码运行没有任何问题.但是当我在返回视图之前调试时,我看到产品包含的变体列表是空的.当我打开更详细的调试信息时,它会向我显示收集错误.
在我的Web应用程序的视图中,我正在尝试执行以下操作
<%
foreach (var variant in Model.Variants)
{%>
kleur: <%= variant.Color %>
van: <%= variant.FromPrice %> voor: <%= variant.Price %>
<%} %>
Run Code Online (Sandbox Code Playgroud) 我正在为一个项目设置NHibernate,我有一些查询,由于它们的复杂性,我们将作为存储过程离开.我希望能够使用NHibernate来调用sprocs,但遇到了一个我无法弄清楚的错误.由于我正在使用Fluent NHibernate,我正在使用此处推荐的混合模式映射.但是,当我运行应用程序时,我得到一个"命名查询未知:AccountsGetSingle"异常,我无法弄清楚原因.我想我的HBM映射可能有问题,因为我对使用它们并不是很熟悉,但我不确定.
我的NHibernate配置代码是:
private ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2005
.ConnectionString((conn => conn.FromConnectionStringWithKey("CIDB")))
.ShowSql())
.Mappings(m =>
{
m.HbmMappings.AddFromAssemblyOf<Account>();
m.FluentMappings.AddFromAssemblyOf<Account>();
})
.BuildSessionFactory();
}
Run Code Online (Sandbox Code Playgroud)
我的hbm.xml文件是:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<sql-query name="AccountsGetSingle">
<return alias="Account" class="Core, Account"></return>
exec AccountsGetSingle
</sql-query>
</hibernate-mapping>
Run Code Online (Sandbox Code Playgroud)
我调用sproc的代码如下所示:
public Account Get()
{
return _conversation.Session
.GetNamedQuery("AccountsGetSingle")
.UniqueResult<Account>();
}
Run Code Online (Sandbox Code Playgroud)
任何想法或想法将不胜感激.谢谢.
更新: @kibbled_bits的建议让我得到我正在寻找的最终结果(能够从NHibernate调用存储过程),但我仍然不知道为什么我上面列出的方法不起作用.我仍然很好奇为什么,因为它可以为未来的问题提供有价值的见解.
最近发布的Fluent Nhibernate(1.1)现在支持存储过程.我想知道是否有人在那里找到了关于如何做到这一点的任何好的博客文章!
我不是要问使用经典的hbm映射而是先前问过这些问题:
我无法访问以下链接的文档:
http://support.fluentnhibernate.org/discussions/help/18-stored-procedure John Peterson的博客文章似乎也没有用.
任何帮助将不胜感激.我想在过渡时期我可以使用旧的hbm映射方法 - 但如果可以的话,我宁愿使用流畅的nhibernate.
使用流畅的nhibernate和自动化(nhibernate创建我的数据库模式),我怎样才能获得nhibernate在数据库中基于以下类创建一个nvarchar(max)列
public class VirtualPage : BaseEntity
{
public virtual int ParentId { get; set; }
public virtual string PageName { get; set; }
public virtual string Title { get; set; }
public virtual string Body { get; set; }
public virtual string ViewName { get; set; }
public virtual string ViewData { get; set; } // this must be nvarchar(max)
}
Run Code Online (Sandbox Code Playgroud) 在我工作的公司中,我们使用Fluent NHibernate作为数据对象模型.几天前,我们遇到了一个问题,Fluent NHibernate生成了一个额外的列,它既不存在于模型中,也不存在于映射中.情况如下:
我的模型:FirstClass.cs
public class FirstClass
{
public virtual int Id { get; private set; }
public virtual SecondClass MyReference { get; set; }
public virtual DateTime DecisionDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的映射:
public class FirstClassMap : ClassMap<FirstClass>
{
public FirstClassMap()
{
Id(x => x.Id);
Map(x => x.DecisionDate);
References(x => x.MyReference);
}
}
Run Code Online (Sandbox Code Playgroud)
使用以下代码构建架构后,
Instance._sessionFactory = Fluently.Configure()
.Database(MySQLConfiguration.Standard
.ConnectionString(connectionString)
.ShowSql())
.ExposeConfiguration(c =>
{
c.Properties.Add("current_session_context_class", ConfigurationHelper.getSetting("SessionContext"));
})
.ExposeConfiguration(BuildSchema)
.Mappings( m => m.FluentMappings.AddFromAssemblyOf<Community>())
.BuildSessionFactory();
Run Code Online (Sandbox Code Playgroud)
使用具有Id列的SecondClass表的索引和外键生成名为"SecondClass_id"的额外列.这是生产的表格:
CREATE TABLE `FirstClass` (
`Id` …Run Code Online (Sandbox Code Playgroud) nhibernate nhibernate-mapping fluent-nhibernate fluent-nhibernate-mapping
我有一个问题,NHibernate查询数据库的方式太多次了.我刚刚意识到它可能与n + 1问题有关,但我无法弄清楚如何改变我的映射来解决问题.
正如您将看到的,我的尝试涉及指定不延迟加载其他对象,但它似乎没有做到这一点.
这是查询:
public IQueryable<Report> ReadAll(DateTime since)
{
return m_session.QueryOver<Report>()
.JoinQueryOver(r => r.Mail)
.Where(m => m.Received >= since)
.List()
.AsQueryable();
}
Run Code Online (Sandbox Code Playgroud)
在此先感谢您的回复!如果您需要有关我的对象或映射的更多信息,请告诉我们.
简化对象图(一些省略):
public class Report : EntityBase
{
public virtual Product Product { get; set; }
public virtual StackTrace StackTrace { get; set; }
public virtual Mail Mail { get; set; }
public virtual IList<ClientUser> ReadBy { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
-
public class Product : EntityBase
{
public virtual string Name { get; set; }
public …Run Code Online (Sandbox Code Playgroud) 我一直试图在Ayende的博客之后做一个非常简单的审计场景,这似乎是每个人在IPreUpdateEventListener和IPreInsertEventListener时所引用的资源.
然而,无论我怎么努力,我都无法让它发挥作用.事件正确启动,当我通过它时一切看起来都没问题,但是我的"更改时间"没有更新到数据库.
我花了大约一天google搜索这一点,并终于找到了答案在这里.
当您使用dynamic-update ="true"映射实体时,它将无法工作.果然,对我来说就是这样.既然我很难找到这条信息,那么使用dynamic-update ="true"是不常见的?我们在所有实体上使用它.
由于这对我们来说是一个重大障碍,我想问一下这有什么办法吗?
我一直在关注IInterceptor,但它总是被认为是过时的,那么这有什么缺点呢?另外,我还没有找到一个关于如何使用IInterceptor进行相同审计(使用插入/更新时间戳)的非常好的教程(我对NHibernate相当新).
任何帮助,将不胜感激!
我正在努力解决NHibernate相关的问题,我可以使用一些输入.
介绍:
我有一个遗留数据库,其中关系概念尚未真正应用.
在数据库中,我有一个OrderLine表,其中包含订单行的数据.
最重要的是,该表还包含具有Order特定信息的所有列.例如,这可以是客户的订单号.
例如,如果我有10个订单行 - 那么我的OrderLines表中有10行,每行都有所有Order特定数据,例如订单号或客户信息.
我不想在我的代码中使用上面的结构,因此创建了一个视图,Orders以便我可以Order在NHibernate中映射我的NHibernate,然后有一个OrderLines更有意义的set/bag .
映射:(简化)
<class name="Order" table="[view_Orders]">
<bag name="OrderLines">
</class>
<class name="OrderLine" table="OrderLines" />
Run Code Online (Sandbox Code Playgroud)
问题:
视图的复杂性使得无法保存到视图中.尝试NHibernates时抛出此异常:
NHibernate.Exceptions.GenericADOException:无法插入:XXX ---> System.Data.SqlClient.SqlException:视图或函数'view_Orders'不可更新,因为修改会影响多个基表.
我的NHibernate映射被构造为一个Order具有"集合或包" OrderLine对象的对象.理想情况下,我希望NHibernate只保留OrderLine对象集而不是整个对象.
有没有办法实现这个目标?我尝试使用不同的锁定模式锁定对象,但它没有帮助我.