【问题标题】:Orchard Custom Module - Model being picked up by NHibernate - Requiring virtual propertiesOrchard 自定义模块 - NHibernate 拾取模型 - 需要虚拟属性
【发布时间】:2011-10-20 18:13:31
【问题描述】:

我正在 Orchard CMS 中构建一个自定义模块,并且我有以下控制器操作:

public ActionResult Inventory()
{
   var models = _repository.Get<MyModel>();
   return View(new MyViewModel() { MyModels = models.ToList() });
}

现在,当 Orchard 构建它时,会发生异常,因为 NHibernate 已经选择了 MyModel,因为它被视为 PartRecord,我不希望它是。

例外是方法 get_Id 应该是“公共/受保护的虚拟”或“受保护的内部虚拟”。

我可以将 virtual 添加到属性中,但我想避免 NHibernate 参与查看此对象,这是不必要的。

我的问题是,如何添加模型、在视图中访问该模型并禁止 Orchard 将其视为 PartRecord?我实际上在一个单独的存储库中使用该模型,与 Orchard DB 分开。

编辑:附加信息

_repository 是一个 IDbRepository,指向我自己的数据库实例 MyModel 是我的数据的 POCO。我试图避免在 MyModel 中的属性上放置 virtual,我将它们放在这里,以说明我试图避免它们的位置。

public interface IDbRepository : IDependency
{
    T Find<T>(long id) where T : class, IActiveRecord;
    bool Update<T>(T record) where T : class, IActiveRecord;
    bool Remove<T>(T record) where T : class, IActiveRecord;
}

public class MyModel : IActiveRecord
{
    [Key]
    public virtual long Id { get; set; }
    public virtual int SupplierProductId { get; set; }
    public virtual int SupplierId { get; set; }
    public virtual int ProductId { get; set; }
}

除此之外,我的模块确实有一个我创建的设置部分,它确实存储在 Orchard DB 中并在站点设置中进行了编辑。我正在使用处理程序来控制它。但是,我尝试删除处理程序和其他一些东西,以防止 Orchard 将我的对象带入 NHibernate。

【问题讨论】:

  • 这里的_repository 是什么? MyModel 是什么样的?
  • @BertrandLeRoy 我已经编辑了上面的解决方案来回答您的问题,感谢您的调查。

标签: c# asp.net-mvc-3 nhibernate orchardcms


【解决方案1】:

Orchard 自动映射配置假定满足以下条件时将映射任何类:

  • 命名空间以“.Models”或“.Records”结尾
  • 有一个 Id 属性,带有虚拟访问器
  • 该类既不是密封的也不是抽象的
  • 该类没有实现IContent 或继承自ContentPartRecord

因此,如果您阻止这些标准中的任何一个为真,那么您应该是好的。例如,在不以.Models.Records 结尾的命名空间中定义您的类就足够了。

【讨论】:

  • 太棒了,谢谢。我将它移出模型 .Models 命名空间,并且做到了。此外,良好的彻底答案教会了我很多。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多