0

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

这是关系: 在此处输入图像描述

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

如何过滤 CultureCode=System.Threading.Thread.CurrentThread.CurrentCulture.Name.Substring(0, 2).ToUpper() 的“Product_Type_Culture”数据,使其仅包含一行并将标签映射到“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");
            }));

        }
    }

谢谢!

4

1 回答 1

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

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

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();
}
于 2012-07-05T06:56:55.117 回答