2013-05-07 75 views
0

我与已经通过以下方式被映射到其域模型的工作工作的正确方法:NHibernate的,与代理

  • IProxy合同(包括身份证)
  • 实体类实现合同

实施例:

public class Product : IProductProxy {} 

类使用以下逻辑映射:

<class name="Product" table="[Products]" lazy="true" proxy="IProductProxy"> 

现在我发现下面的方法正常工作:

var result = session.Load<IProductProxy >(1); 
var result = session.Get<IProductProxy>(1); 
var result = session.Get<Product>(1); 

虽然这些方法抛出“代理例外”或“无效强制转换异常”

var result = session.Load<Product>(1); 

我需要知道的是,使用代理和NHibernate的正确方式是什么。例如,我虽然是直接与界面的工作就可以了,但是当我尝试这样做:

// successful save 
var result = session.Get<Customer>("ALFKI"); 
result.Name = "XXX"; 
session.Update(result); 

// if error occurs I receive wrong exception 
// cannot find mapping for ICustomerProxy ERROR 
var result = session.Get<ICustomerProxy>("ALFKI"); 
result.Name = "XXX"; 
session.Update(result); 

我就应该总是转换回IProxy或者我应该用我的实体类型?

+0

提供自己的代理接口的原因是什么? – cremor 2013-05-07 10:47:37

+0

这不是问题 – Raffaeu 2013-05-07 12:37:32

+0

提供自己的代理接口不是NHibernate代理的正常用法。如果我们知道你为什么这样做,我们可能会更好地帮助你。 – cremor 2013-05-08 06:01:28

回答

1

var result = session.Load<Product>(1);无法正常工作。 Load()如果实体尚未处于会话中,则返回代理。如果您告诉NHibernate该实体类型的代理只需要实现IProductProxy接口,那么NHibernate应该如何创建Product类型的代理(继承类)?

+0

这是我正在寻找的答案。不幸的是,我没有在文档中发现Load总是返回代理对象。 – Raffaeu 2013-05-08 06:06:24