Wie kann ich in Entity Framework eine referenzielle Einschränkung mithilfe einer Teilmenge des Primärschlüssels erstellen?

entity-framework

Frage

Mein Datenmodell enthält zwei Tabellen mit zusammengesetzten Primärschlüsseln und eine assoziative Tabelle. Ein Teil des zusammengesetzten Primärschlüssels ist zwischen den Tabellen gleich.

SitePrivilege
-------------
SiteId
PrivilegeId

UserSite
--------
SiteId
UserId

UserSitePrivilege
-----------------
UserId
SiteId
PrivilegeId

Ich habe eine SitePrivilege-Entität und eine UserSite-Entität erstellt. Ich habe eine viele-zu-viele-Zuordnung zwischen ihnen zu UserSitePrivilege zugeordnet.

<Association Name="UserSiteSitePrivilege">
  <End Type="PrivilegeModel.UserSite" Multiplicity="*" Role="UserSite" />
  <End Type="PrivilegeModel.SitePrivilege" Multiplicity="*" Role="SitePrivilege" />
</Association>
...
<AssociationSetMapping Name="UserSiteSitePrivilege" TypeName="PrivilegeModel.UserSiteSitePrivilege" StoreEntitySet="UserSitePrivilege">
  <EndProperty Name="SitePrivilege">
    <ScalarProperty Name="PrivilegeId" ColumnName="PrivilegeId" />
    <ScalarProperty Name="SiteId" ColumnName="SiteId" />
  </EndProperty>
  <EndProperty Name="UserSite">
    <ScalarProperty Name="SiteId" ColumnName="SiteId" />
    <ScalarProperty Name="UserId" ColumnName="UserId" />
  </EndProperty>
</AssociationSetMapping>

Der obige Code erzeugt diesen Fehler:

Jede der folgenden Spalten in der Tabelle UserSitePrivilege ist mehreren konzeptionellen Seiteneigenschaften zugeordnet: UserSitePrivilege.SiteId ist UserSiteSitePrivilegeSitePrivilege.SiteId, UserSiteSitePrivilege.UserSite.SiteId zugeordnet

Also habe ich eine referenzielle Einschränkung hinzugefügt.

<Association Name="UserSiteSitePrivilege">
  <End Type="PrivilegeModel.UserSite" Multiplicity="*" Role="UserSite" />
  <End Type="PrivilegeModel.SitePrivilege" Multiplicity="*" Role="SitePrivilege" />
  <ReferentialConstraint>
    <Principal Role="UserSite">
      <PropertyRef Name="SiteId"/>
    </Principal>
    <Dependent Role="SitePrivilege">
      <PropertyRef Name="SiteId"/>
    </Dependent>
  </ReferentialConstraint>
</Association>
...
<AssociationSetMapping Name="UserSiteSitePrivilege" TypeName="PrivilegeModel.UserSiteSitePrivilege" StoreEntitySet="UserSitePrivilege">
  <EndProperty Name="SitePrivilege">
    <ScalarProperty Name="PrivilegeId" ColumnName="PrivilegeId" />
    <ScalarProperty Name="SiteId" ColumnName="SiteId" />
  </EndProperty>
  <EndProperty Name="UserSite">
    <ScalarProperty Name="SiteId" ColumnName="SiteId" />
    <ScalarProperty Name="UserId" ColumnName="UserId" />
  </EndProperty>
</AssociationSetMapping>

Nun wird dieser Fehler erzeugt:

Eigenschaften, auf die UserSite der Hauptrolle verweist, müssen mit dem Schlüssel des EntityType PrivilegeModel.UserSite, auf den die Hauptrolle in der Beziehungseinschränkung für Relationship PrivilegeModel.UserSiteSitePrivilege verweist, genau identisch sein. Stellen Sie sicher, dass alle Schlüsseleigenschaften in der Hauptrolle angegeben sind.

Wie modelliere ich diese Beziehung richtig?

Akzeptierte Antwort

Überlappende FKs wie diese werden in 3.5 SP1 nicht unterstützt.

dh

UserSitePrivilege
----------
UserId 
SiteId
PrivilegeId

PK => UserId, SitedId, PrivilegeId
FK1 => UserId, SiteId
FK2 => SiteId, PrivilegeId

FK1 überlappt sich mit FK2. Dies wird ab Beta2 von EF 4 unterstützt. Dies liegt daran, dass FK Associations (die in Beta2 verfügbar sind) viel flexibler sind als Independent Associations (was Sie in 3.5 SP1 und 4.0 Beta 1 haben).

Weitere Informationen zu FK Associations finden Sie in diesem Beitrag

In der Zwischenzeit besteht die einzige Möglichkeit darin, all dies hinter den DefininingQueries- und CUD-Prozeduren usw. zu verbergen.

  • Alex

Beliebte Antwort

Wenn Ihr Primärschlüssel ein zusammengesetzter Schlüssel ist, müssen alle Fremdschlüsselbeziehungen den gesamten zusammengesetzten Schlüssel (alle Schlüsselspalten) als Referenz verwenden. Ich sehe keine Möglichkeit, dies zu umgehen. Dies ist ein grundlegender Grundsatz der relationalen Datenbank Design wirklich.

Dies ist definitiv einer der Hauptgründe, warum ich wahrscheinlich eine Ersatzspalte in der Haupttabelle für den Primärschlüssel verwenden würde, anstelle eines zusammengesetzten Schlüssels, der aus tatsächlichen Datenspalten besteht.

UPDATE: Ja, aufgrund Ihres Kommentars haben Sie absolut Recht - das DB-Design ist solide. Nicht ganz sicher, warum EF nicht damit umgehen kann ...

Marc



Related

Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum