【问题标题】:Fluent nhibernate automapping collection流畅的 nhibernate 自动映射集合
【发布时间】:2011-03-13 04:37:54
【问题描述】:

我正在尝试使用 FNHib 自动映射来映射我的收藏。我要解决的问题是:

1) 我希望我在项目中的所有收藏都通过私有字段进行映射。我怎么能在全球范围内这么说?

2) 有没有办法在不显式覆盖我的每个实体的情况下自动映射双向关系。

类组织实体示例:

private ISet<> _collectionWarehouse;
public virtual IEnumerable<WarehouseEntity> CollectionWarehouse
{

get{return _collectionWarehouse; }

set{_collectionWarehouse = new HashedSet<WarehouseEntity>((ICollection<WarehouseEntity>)value)}

}

类 WarehouseEntity 示例:

public virtual OrganizationEntity Organization{get;set;}

【问题讨论】:

  • James Gregory 2010 年 3 月 12 日 目前,您不能。自动映射器非常固执且不灵活,它希望将集合公开为 IList 或 ISet。我在你的另一个问题中也说了同样的话,但这是我正在积极努力改进的事情。不过,我意识到,现在并没有太多整合。同样,您的选择是接受域中的妥协(公开 IList),覆盖每一次出现,或者不对这些类使用自动映射。 support.fluentnhibernate.org/discussions/help/…

标签: fluent-nhibernate automapping


【解决方案1】:

您可以使用以下约定将您的集合映射到“全局”的私有字段:

// assumes camel case underscore field (i.e., _mySet)
public class CollectionAccessConvention : ICollectionConvention
{
    public void Apply(ICollectionInstance instance) {
        instance.Access.CamelCaseField(CamelCasePrefix.Underscore);
    }
}

当您想在 FNH 中设置“全局”自动映射首选项时,请考虑约定。如果需要,您可以在给定的类映射上使用 IAutoOverride。

就集合(HashSet 通常也是我真正想要的)部分而言,上次我不得不做一些映射时,我确实需要做一个覆盖,比如:

   public class ActivityBaseMap : IAutoMappingOverride<ActivityBase>
{
    public void Override(AutoMapping<ActivityBase> m)
    {
        ...
        m.HasMany(x => x.Allocations).AsSet().Inverse();

    }
}

我确实同意这应该转化为约定,也许这些天你可以这样做。如果你想通了请留言。

HTH,
浆果

使用哈希集作为 ICollection 的代码 =================

public virtual ICollection<WarehouseEntity> Wharehouses
{
    get { return _warehouses ?? (_warehouses = new HashSet<WarehouseEntity>()); }
    set { _warehouses = value; }
}
private ICollection<WarehouseEntity> _warehouses;

【讨论】:

  • 嗯,这就是我想要避免的——覆盖每个实体。
  • btw ICollectionConvention 即使使用 IList 或 ISet 也不起作用。我应该按什么顺序配置我的替代、覆盖和约定?
  • 好吧,又是没有运气的一天。嘿,Berryl,你能给我更多关于这个的提示吗?
  • 您需要了解两个技巧。首先,NHib 或 NHib / FNH 的组合(我不记得究竟为什么不)不映射 ISet。第二个技巧是 HashSet 实现了 NHib 完美映射的 ICollection。因此,与我添加到答案中的代码类似的代码应该可以为您完成。如果没有,请告诉我。和平
  • 不幸的是我仍然有麻烦。我的映射仍然有 。我认为流利的自动映射仅在 ISet 和 IList 通过属性公开时才识别它们。所以我不确定是否可以生成这个映射。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2010-11-22
  • 2011-01-05
  • 1970-01-01
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多