NHibernate Fluent - Comment mapper la colonne de clé étrangère comme une propriété
Je suis sûr que c'est une question simple, mais de considérer les éléments suivants:
J'ai une référence entre la compagnie et le secteur comme suit:
public class Company {
public Guid ID { get; set; }
public Sector Sector { get; set; }
public Guid SectorID { get; set; }
}
public class Sector {
public Guid ID { get; set; }
public string Name { get; set; }
}
Ok. Ce que je veux, c'est la SectorID de l'objet de la Société à être peuplée après je vais:
(new Company()).Sector = new Sector() { Name="asdf" }
et de faire un flush.
La cartographie, je suis en utilisant gentiment crée une colonne supplémentaire dans la base de données appelée Sector_Id dans la table de la Société, mais ce n'est pas disponible en tant que propriété de l'Entreprise. Je veux le SectorID propriété d'être rempli.
La cartographie, je suis actuellement à l'aide de la CompanyMap est
References(c => c.Sector).Cascade.All();
Quelqu'un a une idée?
Merci pour votre réponse.
Malheureusement, si je fais la deuxième option (réglage de la colonne nom de la colonne à être la même que la propriété, ou un ensemble Map(x => x.SectorID, "Sector_Id")
puis j'obtiens l'erreur:
Système.IndexOutOfRangeException: index non Valide 7 pour cette SqlParameterCollection avec Count=7.
J'ai peut-être de faire la première option, mais je suis préoccupé par une requête supplémentaire sera déclenché lorsque vous appelez la SectorID obtenir qu'il obtient le Secteur de la db (sauf s'il est désireux chargé qui est un peu compliqué).
Je suis surpris de voir qu'il n'est pas facile de répondre à cela.
WOW!
Si j'utilise
public virtual Guid SectorID
{
get { return Sector.ID;
}
puis nhibernate est assez intelligent pour savoir que l'Sector_id colonne dans l'Organisation de la requête est en fait la même chose en tant que Secteur.ID et il revient cette sous le capot. Il n'a pas à envoyer une requête supplémentaire, même si vous le lazy load. Je suis impressionné!
Suivi... Il semble que hibernate n'est pas vraiment écrit pour être en mesure de mapper la colonne de clé étrangère dans les objets. Même si cela peut être un peu de douleur dans les serveurs web frontaux, cela fait sens car c'est vraiment une persistance qui ne concernent pas vraiment un objet de préoccupation.
Je suis à l'aide de asp.net MVC et ont écrit un modèle de liaison personnalisé qui prendra une zone de saisie de nom de Contact (plutôt que ContactID), les nouvelles en place d'un nouveau Contact avec l'ID de ce qui est dans le texbox, et ensuite l'appliquer à la propriété du Modèle. Cela permet de contourner le problème avec des listes déroulantes dans les serveurs web frontaux. Affichera le code si quelqu'un est intéressé.
OriginalL'auteur | 2009-04-01
Vous devez vous connecter pour publier un commentaire.
C'est facile à faire avec une formule de propriété.
Ce devrait agir exactement comme vous le souhaitez. Lorsque le
Company
est nouveau,SectorId
sera nul; quandCompany
est récupérée à partir de la DB,SectorId
sera remplie avec la formule donnée de la valeur. LeSectorId
est exposé comme une propriété, ce qui le rend vraiment agréable de traiter avec le web, les menus déroulants, etc. Lorsque vous enregistrez, vous aurez toujours besoin de lier le "réel" de l'association. En supposant queSectorId
a été sélectionnée dans un formulaire...OriginalL'auteur Jarrett Meyer
Deux réflexions: tout d'Abord, ne serait pas quelque chose comme ceci accomplir ce que vous voulez?
Deuxième, lorsque vous dites que la cartographie créé une colonne dans la base de données appelée Sector_Id, c'est qu'en plus d'une colonne que vous avez créé sous le nom SectorID? Si oui, vous pouvez modifier le nom de la colonne de sorte qu'il utilise le nom correct (voici la documentation pour les mappages, voir quelques têtes vers le bas "en Précisant le nom de la colonne").
Aussi, êtes-vous à la cartographie de la SectorID de propriété (par exemple. "La carte(x => x.SectorID, "Sector_Id")")?
OriginalL'auteur Chris Shaffer
Steve vous n'avez pas besoin ForeignKey propriété dans la classe POCO.
Par exemple, si vous essayez d'obtenir l'id de l'article de l'auteur pas de joindre à sélectionner sera effectuée.
var authorID = Article.Auteur.ID
OriginalL'auteur Alexey Zakharov