2016-04-18 2 views
0

Wie kann ich dieses Szenario mit Entity Framewrok-Code Erstes Modell:Entwerfen Sie ein generisches Modell für mehrere Entitäten mit Entity Framework

Katzen:

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

Hunde:

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

Besitzer:

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

Dies ist nur ein Beispiel für das, was ich erreichen möchte. Ich brauche, dass Besitzer Tabelle kann jedes Tier speichern, ich meine, ich habe keine Kontrolle über die Tier Tabellen, so plus Katzen und Hunde, kann es Mäuse, Löwen, etc.

Entity Framework dies unterstützen? Kann ich dies mit Navigationseigenschaften modellieren?

Ich habe über Tabelle per Hierarchie gelesen, aber denke nicht, dass diese Vorgehensweise folgen sollte. Außerdem möchte ich von der Owner-Tabelle zu einer beliebigen tierischen Entität navigieren.

+0

Was versucht Ihr haben? Übrigens ist TPH die Antwort ;-) – CodeNotFound

Antwort

0

Ich biete Ihnen diese Lösung, die vollständig kompatibel mit Ihren Tabellen und auch wenn Sie eine weitere Tabelle mit neuen Tier hinzuzufügen, ist es nicht erforderlich, Änderungen an Owner Klasse vorzunehmen, deshalb ist es generische Ansatz wie Sie gewünscht.

MODELLE:

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; 
     } 
    } 
} 

UMSETZUNG:

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

Ich denke, dass es keinen Grund gibt, Besitzer von Tier zu erben, wie es in der realen Welt nicht möglich ist (zumindest in unseren Tagen). – Mardok

+0

Es war kein Hinweis, nur OOP. –

Verwandte Themen