2016-04-18 1 views
0

Comment puis-je modéliser ce scénario avec le code entité Framewrok Première:Concevoir un modèle générique pour plusieurs entités avec Entity Framework

Cats:

| Id | Name | 
|----|-------| 
| 1| Cat1| 
| 2| Cat2| 
| 3| Cat3| 

Chiens:

| Id | Name | 
|----|-------| 
| 1 | Dog1| 
| 2 | Dog2| 
| 3 | Dog3| 

Propriétaire:

| Id | Name |TableName |EntityId| 
|----|-------|-------------------- 
| 1 | John| Dog |  1| 
| 2 | Pete| Cat |  1| 
| 3 |Jessica| Cat |  2| 

Ceci est juste un exemple de ce que je veux accomplir. J'ai besoin que la table propriétaire puisse stocker n'importe quel animal, je veux dire, je n'ai aucun contrôle sur les tables des animaux, donc plus les chats et les chiens, il peut y avoir des souris, des lions, etc

Entity Framework support this? Puis-je modéliser ceci avec les propriétés de navigation?

J'ai lu sur la table par la hiérarchie, mais ne pense pas que cela devrait suivre cette approche. Aussi, je veux naviguer de la table de propriétaire à n'importe quelle entité animale.

+0

Quels ont essayé votre? Au fait, TPH est la réponse ;-) – CodeNotFound

Répondre

0

Je vous offre cette solution, que complètement compatible avec vos tables et aussi si vous allez ajouter une autre table avec un nouvel animal, il n'est pas nécessaire d'apporter des changements à Owner classe, c'est pourquoi c'est une approche générique comme vous voulu.

MODÈLES:

public class Animal 
{ 
    public int Id { get; set; } 
    [StringLength(64)] 
    public string Name { get; set; } 
} 

public class Dog : Animal 
{ 
} 

public class Cat : Animal 
{ 
} 

public class Owner 
{ 
    public int Id { get; set; } 
    [StringLength(64)] 
    public string Name { get; set; } 

    [StringLength(64)] 
    public string TableName { get; private set; } 
    public int? EntityId { get; private set; } 

    [NotMapped] 
    public Animal animal { 
     get { 
      if (EntityId == null || string.IsNullOrEmpty(TableName)) 
       return null; 

      using (var context = new Context()) 
      {      
       var type = typeof(Animal).Assembly.GetTypes().Where(x => x.Name.Contains(TableName)).First(); 
       return (Animal)context.Set(type).Find(EntityId);           
      } 
     } 
     set { 
      //I assume that animal has already existed on this moment i.e. Id field is valid. 
      EntityId = value.Id; 
      TableName = value.GetType().Name; 
     } 
    } 
} 

MISE EN ŒUVRE:

var cat = context.Cats.Add(new Cat { Name = "Cat1" }); 
context.SaveChanges(); 

var owner = context.Owners.Add(new Owner { Name = "Owner", animal = cat }); 
context.SaveChanges(); 

var animal = owner.animal; 
+0

Je pense qu'il n'est pas nécessaire d'hériter de Animal, car dans le monde réel ce n'est pas possible (au moins de nos jours). – Mardok

+0

Ce n'était pas un indice, juste une POO. –