Entity Framework: Не распознается ограничение внешнего ключа 0..1-ко-многим? - PullRequest
1 голос
/ 23 февраля 2011

Я использую EF4 для сопоставления схемы БД с объектной моделью;Сначала я сгенерировал EDMX из базы данных, но редактировал XML напрямую (пытаясь оставить SSDL таким же, изменяя CSDL / MSL для приближения к желаемой объектной модели).База данных содержит, помимо прочего, пару таблиц с ограничением (0 ..) 1-ко-многим через внешний ключ, например:

go
create table Options (
    KitNodeID int primary key foreign key references KitNodes (KitNodeID),
    [SKUID] int null foreign key (SKUID) references SKUs (SKUID)
)
go
create table Upgrades (
    UpgradeID int identity (1, 1) primary key not null,
    [Name] nvarchar(50) not null,
    DefaultOptionID int null references Options (KitNodeID)
)

Соответствующие разделы в EDMX выглядят так:

[...]

<!-- SSDL content -->
        <edmx:StorageModels>
        <Schema Namespace="DModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl">
            <EntityContainer Name="DModelStoreContainer">

      <AssociationSet Name="FK__Upgrades__Defaul__70DDC3D8" Association="DModel.Store.FK__Upgrades__Defaul__70DDC3D8">
        <End Role="Options" EntitySet="Options" />
        <End Role="Upgrades" EntitySet="Upgrades" />
      </AssociationSet>
</EntityContainer>
    <EntityType Name="Upgrades">
      <Key>
        <PropertyRef Name="UpgradeID" />
      </Key>
      <Property Name="UpgradeID" Type="int" Nullable="false" StoreGeneratedPattern="Identity" />
      <Property Name="Name" Type="nvarchar" Nullable="false" MaxLength="50" />
      <Property Name="DefaultOptionID" Type="int" />
    </EntityType>
<Association Name="FK__Upgrades__Defaul__70DDC3D8">
          <End Role="Options" Type="DModel.Store.Options" Multiplicity="0..1" />
          <End Role="Upgrades" Type="DModel.Store.Upgrades" Multiplicity="*" />
          <ReferentialConstraint>
            <Principal Role="Options">
              <PropertyRef Name="KitNodeID" />
            </Principal>
            <Dependent Role="Upgrades">
              <PropertyRef Name="DefaultOptionID" />
            </Dependent>
          </ReferentialConstraint>
        </Association>
</Schema></edmx:StorageModels>

<!-- CSDL content -->
    <edmx:ConceptualModels>
      <Schema Namespace="DModel" Alias="Self" xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation" xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
        <EntityContainer Name="DEntities" annotation:LazyLoadingEnabled="true">
<EntitySet Name="Upgrades" EntityType="DModel.Upgrade" />
          <AssociationSet Name="Upgrade_DefaultOption" Association="DModel.Upgrade_DefaultOption">
            <End Role="Options" EntitySet="Options" />
            <End Role="Upgrades" EntitySet="Upgrades" />
          </AssociationSet>
</EntityContainer>
  <Association Name="Upgrade_DefaultOption">
          <End Role="Options" Type="DModel.Option" Multiplicity="0..1" />
          <End Role="Upgrades" Type="DModel.Upgrade" Multiplicity="*" />
        </Association>
<EntityType Name="Upgrade">
          <Key>
            <PropertyRef Name="UpgradeID" />
          </Key>
          <Property Name="UpgradeID" Nullable="false" annotation:StoreGeneratedPattern="Identity" Type="Int32" />
          <Property Name="Name" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" />
          <NavigationProperty Name="DefaultOption" Relationship="DModel.Upgrade_DefaultOption" FromRole="Upgrades" ToRole="Options" />
          <NavigationProperty Name="OptInOptions" Relationship="DModel.OptInOptions" FromRole="Upgrades" ToRole="Options" />
        </EntityType>
     </Schema>
    </edmx:ConceptualModels>

   <!-- C-S mapping content -->
    <edmx:Mappings>
      <Mapping Space="C-S" xmlns="http://schemas.microsoft.com/ado/2008/09/mapping/cs">
        <EntityContainerMapping StorageEntityContainer="DModelStoreContainer" CdmEntityContainer="DEntities">
          <EntitySetMapping Name="Upgrades"><EntityTypeMapping TypeName="DModel.Upgrade"><MappingFragment StoreEntitySet="Upgrades">
            <ScalarProperty Name="UpgradeID" ColumnName="UpgradeID" />
            <ScalarProperty Name="Name" ColumnName="Name" />
          </MappingFragment></EntityTypeMapping></EntitySetMapping>
 <AssociationSetMapping Name="Upgrade_DefaultOption" TypeName="DModel.Upgrade_DefaultOption" StoreEntitySet="FK__Upgrades__Defaul__70DDC3D8">
            <EndProperty Name="Upgrades">
              <ScalarProperty Name="UpgradeID" ColumnName="UpgradeID"/>
            </EndProperty>
            <EndProperty Name="Options">
              <ScalarProperty Name="KitNodeID" ColumnName="DefaultOptionID"/>
            </EndProperty>
          </AssociationSetMapping>
 </EntityContainerMapping>
      </Mapping>
    </edmx:Mappings>

Он генерирует код, но когда я пытаюсь его использовать, я получаю сообщение об ошибке «Ошибка 2007: таблица» FK_ Обновления _Defaul__70DDC3D8 ', указанный как часть этого MSL, не существует в MetadataWorkspace. "Похоже, он не может найти основное ограничение внешнего ключа, которое должен использовать SSDL, но я вижу его с таким именем в базе данных.

Действительно, я чувствую, что у меня нет оченьхорошее понимание того, как этот тип отображения должен работать в целом - действительно ли ограничение внешнего ключа в базе данных рассматривается как «набор ассоциаций»?- но это самое близкое, что я могу решить.Я не знаю, может ли кто-нибудь диагностировать проблему по информации, которую я дал, но есть ли какие-нибудь указатели на то, где искать?Я пробовал разные вещи, такие как изменение StoreEntitySet, чтобы он указывал на Options, и т. Д., Но они просто приводили к различным ошибкам.

1 Ответ

1 голос
/ 23 февраля 2011

Попробуйте изменить способ определения внешнего ключа, см. Как создать внешний ключ в SQL Server?

Возможно, вам придется удалить и воссоздать вашу модель.

...