2010-11-04 5 views
0

Je suis en train de faire des recherches pour savoir si Entity Framework et (couramment) nHibernate sont les mieux adaptés à un projet. Et je suis tombé sur des problèmes de cartographie. J'espère que quelqu'un ici peut me aider avec une solution rapide à mon problème :)Comment mapper avec deux instances d'une classe dans une seconde classe en utilisant nhibernate fluent?

Voici mes classes d'entité:

public abstract class DisplayItem 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 
} 

public class Link : DisplayItem 
{ 
    public virtual Node FromNode { get; set; } 
    public virtual Node ToNode { get; set; } 

    public Link() 
    { 
    } 
} 

public class Node : DisplayItem 
{ 
    public virtual IList<Link> LinksFrom { get; set; } 
    public virtual IList<Link> LinksTo { get; set; } 

    public Node() 
    { 
     LinksFrom = new List<Link>(); 
     LinksTo = new List<Link>(); 
    } 
} 

J'ai essayé d'abord d'utiliser le mappeur automatique, mais cela ne fonctionne pas du tout. Il a créé la base de données et les données enregistrées, mais les données n'étaient pas correctement connectées. Je pense que le problème vient parce qu'un Link contient deux instances de Node

J'ai ensuite essayé cartographie manuellement, voici le code je:


public class LinkMap : ClassMap 
{ 
    public LinkMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 
     Map(x => x.Description); 
     References(x => x.FromNode); 
     References(x => x.ToNode); 
    } 

} 

class NodeMap : ClassMap 
{ 
    public NodeMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 
     Map(x => x.Description); 
     HasMany(x => x.LinksFrom) 
      .Cascade.All(); 
     HasMany(x => x.LinksTo) 
      .Cascade.All(); 
    } 
} 

Toute idée de ce que je fais mal ici?

+0

Je devinais la réponse. Si ce n'est pas correct, que voulez-vous dire par les données ne sont pas connectés correctement? Et quel héritage voulez-vous utiliser? – Iain

Répondre

1

Tout d'abord, utiliser les médicaments génériques pour vos listes:

public class Node : DisplayItem 
{ 
    public virtual IList<Link> LinksFrom { get; set; } 
    public virtual IList<Link> LinksTo { get; set; } 

    public Node() 
    { 
     LinksFrom = new List<Link>(); 
     LinksTo = new List<Link>(); 
    } 
} 

Deuxièmement, vous avez l'héritage, mais vous n'avez pas dit quel style vous quoi faire dans la base de données. Si vous voulez ignorer l'héritage, de vous devez faire ce Ignoring base-types:

AutoMap.AssemblyOf<Entity>(cfg) 
    .IgnoreBase<Entity>(); 

La valeur par défaut est une table par la sous-classe.

Si vous faites une hiérarchie de table par classe, faites attention à this.

Questions connexes