nHibernate使用过滤器从多对多映射属性(它就像一对一)?

时间:2012-07-04 11:39:01

标签: nhibernate many-to-many one-to-one

我有一个多对多关系,但我需要将它限制为只有一行中具有特定数据的行。

这是关系: enter image description here

我需要在“Product_Type”实体中映射“Label”字段,就好像它在实体中一样。

如何过滤“Product_Type_Culture”数据,其中CultureCode = System.Threading.Thread.CurrentThread.CurrentCulture.Name.Substring(0,2).ToUpper()只在其中有一行并映射标签“Product_Type”实体??

我已经在会话ecc中制作了过滤器......

这是我的“粗鲁”错误的映射。

public class Product_TypeMap : ClassMapping<Product_Type>
    {
        public Product_TypeMap()
        {
            Id(x => x.Id, m => m.Column("Id"));

            Bag(x => x.Label, c =>
            {
                Table("Product_Type_Culture");

                c.Key(k =>
                {
                    k.Column("ProductTypeId");
                });

                c.Filter("cultureFilter", f => f.Condition("CultureCode = :cultureId"));
            }, r => r.ManyToMany(m =>
            {
                m.Class(typeof(Product_Type_Culture));
                m.Column("CultureCode");
            }));

        }
    }

谢谢!

1 个答案:

答案 0 :(得分:0)

AFAIk无法在Property()或Join()

上设置过滤器

选项1

我将摆脱语言表并将文本表作为地图的元素表

public class ProductType
{
    public virtual IDictionary<string, string> Labels { get; private set; }

    // used for Binding etc
    public virtual string Name
    {
        get
        {
            string label;
            var currentlanguage = Thread.CurrentThread.CurrentUICulture;     // eg en-US
            if (!map.TryGetValue(currentlanguage.Name, out label) &&        // en-US
                !map.TryGetValue(currentlanguage.Parent.Name, out label))   // en
            {
                label = "fallback name";
            }
            return label;
        }
        set { Names[Thread.CurrentThread.CurrentUICulture.Name] = value; }
    }
}

并使用以下FNH映射(转换为MbC)

public ProductTypeMap()
{
    [...]
    HasMany(pt => pt.Labels)
        .Table("Texts")
        .KeyColumn("ProductTypeId")
        .AsMap("CultureCode")
        .Element("Label")
        .Not.LazyLoad()
}

优势:灵活 缺点:可能会获取比需要的更多数据,无法在标签上查询

选项2

在Labels表中移动文化名称,并使用在映射中初始化的公式

public ProductTypeMapping()
{
    Property(pt => pt.Label, o => o.Formula("CultureCode = " + Thread.CurrentThread.CurrentUICulture.Name));
}

优点:仅获取相关数据 缺点:无法在运行时更改文化,无法更新标签

选项3

将一个与过滤器合并以减少提取的数据

public ProductTypeMap()
{
    HasMany(pt => pt.Labels)
        .Table("Texts")
        .KeyColumn("ProductTypeId")
        .AsMap("CultureCode")
        .Element("Label")
        .ApplyFilter("cultureFilter", "CultureCode = :cultureName or CultureCode = :parentCultureName")
        .Not.LazyLoad();
}