NHibernate,正确使用代理的方式

时间:2013-05-07 09:05:52

标签: nhibernate proxy

我正在使用以下列方式映射的域模型:

  • IProxy合同(包括Id)
  • 实施合同的实体类

示例:

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还是应该使用我的实体类型?

1 个答案:

答案 0 :(得分:1)

var result = session.Load<Product>(1);无效。如果实体尚未在会话中,Load()将返回代理。如果告诉NHibernate该实体类型的代理只需要实现Product接口,NHibernate应该如何创建类型IProductProxy的代理(继承类)?