2012-04-10 9 views
10

Ich habe einen Entitätstyp namens Image, der von Publikation erbt (es gibt 5 andere Arten von Publikationen, alle haben 10 gemeinsame Eigenschaften).Tabellenaufteilung eines geerbten Entitätstyps?

Leider enthält die Image-Tabelle in meiner Datenbank 4 binäre Spalten mit den Daten für 4 Versionen des Bildes bei unterschiedlichen Auflösungen, also gibt es 4 Eigenschaften des EF-Image-Typs: BinOriginal, BinHiRes, BinLowRes, BinThumbnail sehr große Datenmengen.

Dies beeinträchtigt die Leistung. Ich möchte nicht alle Binärdaten erfassen, wenn ich beispielsweise nur eine Reihe von Bildverknüpfungen erzeuge.

Also habe ich Tischspalt versucht, die vier binäre Felder in eine neue Imagefile Einheit platzieren a la: http://blogs.msdn.com/b/adonet/archive/2008/12/05/table-splitting-mapping-multiple-entity-types-to-the-same-table.aspx

ich die richtige Tabelle-Mapping sichergestellt haben, hinzugefügt, um die 1-1 Vereinigungs- und enthalten die Verweisbeschränkung, aber ich diesen Fehler:

Error 3033: Problem in mapping fragments starting at line 2731:EntitySets 
'ImageFiles' and 'Publications' are both mapped to table 'Images'. Their primary 
keys may collide. 

... es scheint, dass die Tabelle, die geteilt es ein Problem gibt in einer Vererbungsbeziehung beteiligt.

Ich habe versucht, die neue Imagefile EF Art von Veröffentlichung zu erben, aber dann bekomme ich einen Fehler:

Problem in mapping fragments starting at lines 2332, 2374:Two entities with 
different keys are mapped to the same row 

FRAGE Gibt es eine Möglichkeit, um dieses, oder wie die Tatsache, dass ich das Bild brauchen Der EF-Typ, der von der Publikation erbt, schließt die Trennung der anderen Felder in einen neuen Typ aus.

+1

Können Sie das Datenbankschema ändern? I.e. eine separate Tabelle für die Bilder erstellen? –

+0

Ja, das habe ich jetzt als "Workaround" gemacht (es ist eigentlich ein besseres DB Design, aber es war viel mehr Arbeit, da die DB bereits in Produktion ist). Meine Frage nach Tischzerlegung steht immer noch - es ist immer noch ein Aspekt von EF, den ich verstehen möchte. Wenn Sie überprüfen/dokumentieren können, dass es einfach nicht möglich ist, eine Tabelle, die ein Untertyp in einer Vererbungsbeziehung ist, zu teilen, reicht das aus, um eine Antwort zu akzeptieren. – Faust

+0

OK, verstanden, aber ich bin mir nicht sicher, ob ich in das vertiefen werde :). –

Antwort

1

Sie können dies als eine Einschränkung von Entity Framework betrachten: Es gibt tatsächlich zwei Teile, das Modell des zugrunde liegenden Datenbankelements und die Entität, die aus Model erstellt wird. Die Unterklasse der Entity hat keinerlei Auswirkungen auf das Modell.

Wenn Sie nicht möchten, dass alle Daten für ein Modell Zeile laden, Projekt es:

var results = from product in myDB.Products 
       where product.Id == productId 
       select New 
       { 
        Id = product.Id, 
        Name = product.Name, 
        ImageUrl = product.ImageUrl 
       }; 

Die SQL-Abfrage, die Entity Framework erstellt nur wählt die Spalten in der select-Klausel der LINQ-Abfrage

Dies hält Entity Framework auch davon ab, die Tabellenzeile im Objekt ObjectContext (oder DBContext für EF 5) zu speichern.

Als eine Randnotiz wäre ich persönlich versucht, größere binäre Daten in einer NoSQL-Lösung zu speichern, und nur den zugehörigen Schlüssel in der SQL-Datenbank selbst zu pflegen.

Verwandte Themen