Если вы не хотите или не можете определить свойства ассоциации в своих объектах (например, в модульных приложениях, которые поддерживают динамическую загрузку плагинов), вы все равно можете создавать «поддельные» ассоциации с помощью API Fluent.
См. исходный код Orchard, класс ContentItemAlteration. В Orchard сущность ContentItem требуется соединить с записями ContentPart, хранящимися в разных таблицах. Каждый тип ContentPart предоставляется модулями, что означает, что сложно (и, вероятно, нежелательно) изменить источник ContentItem и добавить ассоциацию для каждой новой записи части.
Вот точный код, который я получил из источников Orchard:
/// <summary>
/// Add a "fake" column to the automapping record so that the column can be
/// referenced when building joins accross content item record tables.
/// <typeparam name="TItemRecord">Either ContentItemRecord or ContentItemVersionRecord</typeparam>
/// <typeparam name="TPartRecord">A part record (deriving from TItemRecord)</typeparam>
/// </summary>
class Alteration<TItemRecord, TPartRecord> : IAlteration<TItemRecord> {
public void Override(AutoMapping<TItemRecord> mapping) {
// public TPartRecord TPartRecord {get;set;}
var name = typeof(TPartRecord).Name;
var dynamicMethod = new DynamicMethod(name, typeof(TPartRecord), null, typeof(TItemRecord));
var syntheticMethod = new SyntheticMethodInfo(dynamicMethod, typeof(TItemRecord));
var syntheticProperty = new SyntheticPropertyInfo(syntheticMethod);
// record => record.TPartRecord
var parameter = Expression.Parameter(typeof(TItemRecord), "record");
var syntheticExpression = (Expression<Func<TItemRecord, TPartRecord>>)Expression.Lambda(
typeof(Func<TItemRecord, TPartRecord>),
Expression.Property(parameter, syntheticProperty),
parameter);
mapping.References(syntheticExpression)
.Access.NoOp()
.Column("Id")
.ForeignKey("none") // prevent foreign key constraint from ContentItem(Version)Record to TPartRecord
.Unique()
.Not.Insert()
.Not.Update()
.Cascade.All();
}
}
Этот код просто добавляет ассоциацию «часть» к ContentItem, что позволяет вам использовать объединения в ваших критериях. Если, например, у вас есть часть с именем «ProductPart», которая хранится в таблице с именем «ProductPartRecord», вы можете присоединиться к своему ContentItem на поддельном свойстве «ProductPartRecord».
Кстати, кажется, что эту тактику можно применить и к HasMany стороне поддельного отношения, но я полагаю, что вам нужно настроить источники Fluent.
person
Cagatay Kalan
schedule
21.11.2012