2017-09-14 1 views
1

Ich habe ein Modell mit definiertem Primärschlüssel, aber jetzt muss ich dieser Klasse aus meiner abstrakten Klasse eine Vererbung hinzufügen. Das Problem ist, dass der Primärschlüssel auch die Klasse abstrahieren muss. Die Namen der PK-Eigenschaften sind unterschiedlich und müssen unterschiedlich sein.Entity Framework Code First - Abstrakte Modellklasse ohne Primärschlüssel

Beispiel:

public abstract class AbstractModelClass 
{ 
    public int AbstractModelClassId { get; set; } // this key is required but I want him to not to be because I don't want to have 2 PK's 
    public string Prop1 { get; set; } 
} 

public class ModelClass : AbstractModelClass // before this class was not inherited but now I need this 
{ 
    public int ModelClassId { get; set; } 
    public int Prop2 { get; set; } 
} 
+0

Dies ist ein Vorschlag, den ich auf eine ähnliche [Frage] gemacht habe (https://stackoverflow.com/a/45834364/5148649) – Scrobi

Antwort

1

Warum kann nicht der Primärschlüssel in der abstrakten Klasse sein, aber in der Datenbank ist es verschiedene Tabellen? Überprüfen Sie Table per Concrete Type (TPC) Ansatz in EF. Gute Erklärung hier:

https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and-choosing-strategy-guidelines

Probe:

public abstract class BillingDetail 
{ 
    [DatabaseGenerated(DatabaseGenerationOption.None)] 
    public int BillingDetailId { get; set; } 
    public string Owner { get; set; } 
    public string Number { get; set; } 
} 

public class BankAccount : BillingDetail 
{ 
    public string BankName { get; set; } 
    public string Swift { get; set; } 
} 

public class CreditCard : BillingDetail 
{ 
    public int CardType { get; set; } 
    public string ExpiryMonth { get; set; } 
    public string ExpiryYear { get; set; } 
} 

public class InheritanceMappingContext : DbContext 
{ 
    public DbSet<BillingDetail> BillingDetails { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<BankAccount>().Map(m => 
     { 
      m.MapInheritedProperties(); 
      m.ToTable("BankAccounts"); 
     }); 

     modelBuilder.Entity<CreditCard>().Map(m => 
     { 
      m.MapInheritedProperties(); 
      m.ToTable("CreditCards"); 
     });    
    } 
} 
1

In diesem Fall sehe ich nicht der Zweck der AbstractModelClassId in AbstractModelClass so eine Lösung wäre es nicht haben.
Aber aus irgendeinem Grund brauchen Sie diese Eigenschaft, aber wollen Sie nicht, dass es in DB Tabelle kommt, dann könnten Sie [NotMapped] Attribut hinzufügen.

[NotMapped] 
public int AbstractModelClassId { get; set; } 
Verwandte Themen