我有一个多对多关系,但我需要将它限制为只有一行中具有特定数据的行。
这是关系:
我需要在“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");
}));
}
}
谢谢!
答案 0 :(得分:0)
AFAIk无法在Property()或Join()
上设置过滤器我将摆脱语言表并将文本表作为地图的元素表
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()
}
优势:灵活 缺点:可能会获取比需要的更多数据,无法在标签上查询
在Labels表中移动文化名称,并使用在映射中初始化的公式
public ProductTypeMapping()
{
Property(pt => pt.Label, o => o.Formula("CultureCode = " + Thread.CurrentThread.CurrentUICulture.Name));
}
优点:仅获取相关数据 缺点:无法在运行时更改文化,无法更新标签
将一个与过滤器合并以减少提取的数据
public ProductTypeMap()
{
HasMany(pt => pt.Labels)
.Table("Texts")
.KeyColumn("ProductTypeId")
.AsMap("CultureCode")
.Element("Label")
.ApplyFilter("cultureFilter", "CultureCode = :cultureName or CultureCode = :parentCultureName")
.Not.LazyLoad();
}