2016-11-20 7 views
3

Mit dem Code zuerst Ansatz mit Entity Framework 6.1.3, ich versuche, erstellen und konfigurieren Sie meine eigene Viele-zu-viele-Tabelle basierend auf this post. I stark stimme ihm zu: Ich möchte nicht den Konventionen folgen, weil das mein Design einschränkt.Entity Framework 6 - Primärschlüssel auf Navigationseigenschaft

Siehe die many-to-many with payload Klasse in dem Code Erstens:

public class FooBar 
{ 
    [Key, Column(Order = 1)] 
    public virtual Foo Foo { get; set; } 

    [Key, Column(Order = 2)] 
    public virtual Bar Bar { get; set; } 

    //some more 'payload' properties 
} 

Ich mag es auf diese Weise halten, ohne die skalare Eigenschaften hinzufügen. So Ich mag nicht diese Eigenschaften in meinem Modell:

public int FooId { get; set; } 
public int BarId { get; set; } 

Meine Frage ist speziell wenn es in Entity Framework 6 möglich ist, eine Navigationseigenschaft wie diese als (Composite) Schlüssel zu haben? Most answers zu dieser Frage wurde auf früheren Versionen von Entity Framework basiert, und es war dann nicht möglich. Die Frage ist also, ist es jetzt möglich?

In this answer ist erwähnt, dass:

Sie benötigen Klassen in einer bestimmten Art und Weise zu installieren, so dass EF erkennt, was Ihr zu erreichen versuchen.

Aber es ist mir immer noch unklar, ob es technisch möglich ist. Und wenn ja, könnte jemand ein Muster im Code zur Verfügung stellen, wie man das erreicht?

+2

Die letzte Antwort EF6 ist auch, und es sagt, es ist nicht möglich (obwohl nicht sehr klar angegeben, aber die Informationen sind immer noch auf dem neuesten Stand). –

+0

@GertArnold Ah ich sehe, ich habe die letzte Antwort falsch gelesen (meine schlechte). Ich denke, ich muss leider die Skalareigenschaften hinzufügen, leider. – QuantumHive

Antwort

1

Sie können das nicht tun.

Nicht nur mit EF 6.X, aber es ist auch nicht in EF Core möglich. Es ist von Entwurf. EF kann die Beziehungen nicht zuordnen, wenn Sie diese Skalareigenschaften nicht in der Junction-Tabelle definieren. Wieder muss ich sagen, dass es von Entwurf ist. Sie haben hier leider keine anderen Möglichkeiten. Sie müssen diese Skalareigenschaften in die Junction-Tabelle aufnehmen.

+0

Irgendwie bin ich überrascht, dass es eine Beschränkung durch Design ist. Ich habe gerade diese [gist-Demonstration] (https://gist.github.com/QuantumHive/e515a771172e660a686c0cf923062551) erstellt, um zu veranschaulichen, dass Sie Fremdschlüssel (in einer Eins-zu-Eins-Beziehung) zuordnen können, ohne dafür eine Skalareigenschaft zu deklarieren . Es fällt mir auf, dass Entity Framework uns dies mit Fremdschlüsseln ermöglicht, aber nicht mit Primärschlüsseln. Da es mit Fremdschlüsseln möglich ist, hätte ich auch mit Primärschlüsseln gerechnet, aber leider. – QuantumHive

+0

können Sie so auf die 1: 1-Beziehung tun. Hier ist das Problem, Sie müssen Junction-Tabelle selbst nicht enthalten. Andernfalls können Sie es mit der Fluent-API konfigurieren. Dann haben Sie dieses zusätzliche Modell in Ihrer Domäne nicht. Ich meine 'FooBar'. Hier können Sie sehen, wie Sie M: M ohne Junction-Tabelle konfigurieren, die Sie selbst erstellt haben. http://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx – Sampath

1

Ich hoffe, dass dies für einige nützlich sein wird.

Nach stundenlanger Suche in Suchmaschinen habe ich es endlich geschafft. Leider gibt es keine Antwort auf dasselbe Problem, mit dem Sie und ich konfrontiert waren. Ich wollte einfach nicht meine Design-Entscheidungen zurücknehmen und viele skalare Typen erstellen, wie du es in deinem Post gesagt hast.

komme ich mit der Lösung der Umsetzung Grund OOP up:

// let's assume we would like to have each ObjectModel with 
// unique Name and Class properties 
// this two data will identify the whole row. (i.e ShadowHawk:Bow) 

class ObjectModel { 

    public string Name { get; set; } 
    public ItemClass ItemClass { get; set; } 
    ... 
    public MagicAttr[] Attributes { get; set; } 
    ... 
} 

class ObjectEntity : ObjectModel { 

    public int Class_id 
    ... 
    other foreign keys as primary keys 
} 

Mit diesem Ansatz meine ObjectModel noch sauber ist und unabhängig von EntityFramework Hölle. Ich verwendete Fluent API für die Konfiguration, (auch Daten anno nutzen könnten. Auch die ursprüngliche ObjectModel noch sauber ist)

Verwenden ObjectEntity auf Ihrem Kontext d.h DbSet<ObjectEntity>

Vorsicht!

Sie werden wahrscheinlich mit dem Problem konfrontiert, dass Sie eine Downcast-Methode benötigen (Casting von Eltern zu Kind).Dies ist, wie ich einen niedergeschlagenen auf Elternklasse implementieren hat (bei der Verwendung von AutoMapper)

using AutoMapper; 
... 
    public ObjectEntity Downcast() { 
     var config = new MapperConfiguration(cfg => cfg.CreateMap<ObjectModel, ObjectEntity>()); 
     var mapper = config.CreateMapper(); 
     return mapper.Map<ObjectEntity>(this); 
    } 

Möchten Sie als gut mit informieren:

Direkt von MSDN:

https://msdn.microsoft.com/en-us/library/jj591620(v=vs.113).aspx#Anchor_7

umbenennen Fremdschlüssel, der nicht im Modell definiert ist Wenn Sie

wählen Sie keinen Fremdschlüssel auf dem CLR-Typ zu definieren, aber Sie bestimmen, was Namen in der Datenbank haben soll, gehen Sie wie folgt vor:

modelBuilder.Entity<Course>() 
    .HasRequired(c => c.Department) 
    .WithMany(t => t.Courses) 
    .Map(m => m.MapKey("ChangedDepartmentID")); 
+0

Also im Grunde, was Sie sagen, ist, dass Ihre Domain-Klassen frei von ORM-Konventionen sind (postfixing sie mit "Model"). Und dann erben Ihre ORM-Klassen (z. B. für EF-Postfix mit "'Entity") von der Basisdomänenklasse (die dann jeder Konvention dieses Anbieters entsprechen kann)? Ich würde sagen, das ist eine vernünftige Lösung. Iyi bir fikir abi;) – QuantumHive

Verwandte Themen