Si vous ne voulez pas ou ne pouvez pas définir les propriétés d'association dans vos entités (comme dans les applications modulaires qui prennent en charge le chargement dynamique des plugins), vous pouvez créer des associations "fausses" avec l'API Fluent.
Voir le code source Orchard, classe "ContentItemAlteration". Dans Orchard, l'entité ContentItem doit être jointe aux enregistrements ContentPart stockés dans des tables différentes. Chaque type ContentPart est fourni par des modules, ce qui signifie qu'il est difficile (et probablement pas préférable) de changer la source de ContentItem et d'ajouter une association pour chaque nouvel enregistrement de pièce.
Voici le code exact que je suis arrivé à partir de sources 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();
}
}
Ce code ajoute simplement une association « partie » à ContentItem qui vous permet d'utiliser vos critères dans les jointures. Si, par exemple, vous avez une partie nommée "ProductPart" qui est stockée dans une table nommée "ProductPartRecord", vous pouvez rejoindre votre ContentItem sur la fausse propriété "ProductPartRecord". Par ailleurs, il semble que cette tactique peut également être appliquée au côté HasMany de la fausse relation, mais vous devez personnaliser les sources Fluent, je suppose.
Yeap. Je l'utilise par critères. Je suis à la recherche de la possibilité de créer quelque chose comme ceci: clientèle sélecte, commande du client à la clientèle, premiere commande, l'utilisateur, l'utilisateur où order.SomeID_1 = customer.Id order.SomeID_2 = user.Id I Je ne sais pas au moment du design quel champ contient SomeID_xxx. :/ – dariol
OK, je l'ai. HQL est seulement une option. – dariol
avez-vous pu créer la requête de critères pour cela? si oui pls post..sadly im dans la même situation :( – Illuminati