11

में गैर प्राथमिक अद्वितीय कुंजी का उपयोग करने के लिए वैकल्पिक समाधान मुझे पता है कि इकाई फ्रेम कार्य आपको विदेशी कुंजी एसोसिएशन के रूप में गैर प्राथमिक अद्वितीय कुंजी का उपयोग करके डेटाबेस से मॉडल उत्पन्न करने की अनुमति नहीं देता है। क्या मैं मैन्युअल रूप से ईडीएमएक्स को संशोधित कर सकता हूं? यदि हां, तो क्या कोई मुझे एक उदाहरण या संदर्भ प्रदान कर सकता है? यदि नहीं, तो क्या कोई अन्य संभावनाएं हैं?इकाई फ्रेमवर्क: एक एसोसिएशन

सबसे सरल उदाहरण:

यहाँ तालिकाओं के लिए DDL है। आप मैं Person.TypeCode को

CREATE TABLE [dbo].[PersonType](
    [PersonTypeId] [int] NOT NULL, 
    [TypeCode] [varchar](10) NOT NULL, 
    [TypeDesc] [varchar](max) NULL, 
CONSTRAINT [PK_PersonType] PRIMARY KEY CLUSTERED 
([PersonTypeId] ASC) 
CONSTRAINT [UK_PersonType] UNIQUE NONCLUSTERED 
([TypeCode] ASC) 
) 

CREATE TABLE [dbo].[Person](
    [PersonId] [int] NOT NULL, 
    [TypeCode] [varchar](10) NOT NULL, 
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED 
([PersonId] ASC) 
) 

ALTER TABLE [dbo].[Person] WITH CHECK ADD CONSTRAINT [FK_Person_PersonType] FOREIGN KEY([TypeCode]) 
REFERENCES [dbo].[PersonType] ([TypeCode]) 

ALTER TABLE [dbo].[Person] CHECK CONSTRAINT [FK_Person_PersonType] 

यहाँ PersonType.TypeCode से एक विदेशी कुंजी edmx उत्पन्न होता है

<?xml version="1.0" encoding="utf-8"?> 
<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx"> 
    <!-- EF Runtime content --> 
    <edmx:Runtime> 
    <!-- SSDL content --> 
    <edmx:StorageModels> 
     <Schema Namespace="testModel.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2008" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2006/04/edm/ssdl"> 
     <EntityContainer Name="testModelStoreContainer"> 
      <EntitySet Name="Person" EntityType="testModel.Store.Person" store:Type="Tables" Schema="dbo" /> 
      <EntitySet Name="PersonType" EntityType="testModel.Store.PersonType" store:Type="Tables" Schema="dbo" /> 
     </EntityContainer> 
     <EntityType Name="Person"> 
      <Key> 
      <PropertyRef Name="PersonId" /> 
      </Key> 
      <Property Name="PersonId" Type="int" Nullable="false" /> 
      <Property Name="TypeCode" Type="varchar" Nullable="false" MaxLength="10" /> 
     </EntityType> 
     <!--Errors Found During Generation: 
     warning 6035: The relationship 'FK_Person_PersonType' has columns that are not part of the key of the table on the primary side of the relationship. The relationship was excluded. 
     --> 
     <EntityType Name="PersonType"> 
      <Key> 
      <PropertyRef Name="PersonTypeId" /> 
      </Key> 
      <Property Name="PersonTypeId" Type="int" Nullable="false" /> 
      <Property Name="TypeCode" Type="varchar" Nullable="false" MaxLength="10" /> 
      <Property Name="TypeDesc" Type="varchar(max)" /> 
     </EntityType> 
     </Schema> 
    </edmx:StorageModels> 
    <!-- CSDL content --> 
    <edmx:ConceptualModels> 
     <Schema Namespace="testModel" Alias="Self" xmlns="http://schemas.microsoft.com/ado/2006/04/edm"> 
     <EntityContainer Name="testEntities"> 
      <EntitySet Name="People" EntityType="testModel.Person" /> 
      <EntitySet Name="PersonTypes" EntityType="testModel.PersonType" /> 
     </EntityContainer> 
     <EntityType Name="Person"> 
      <Key> 
      <PropertyRef Name="PersonId" /> 
      </Key> 
      <Property Name="PersonId" Type="Int32" Nullable="false" /> 
      <Property Name="TypeCode" Type="String" Nullable="false" MaxLength="10" Unicode="false" FixedLength="false" /> 
     </EntityType> 
     <EntityType Name="PersonType"> 
      <Key> 
      <PropertyRef Name="PersonTypeId" /> 
      </Key> 
      <Property Name="PersonTypeId" Type="Int32" Nullable="false" /> 
      <Property Name="TypeCode" Type="String" Nullable="false" MaxLength="10" Unicode="false" FixedLength="false" /> 
      <Property Name="TypeDesc" Type="String" MaxLength="Max" Unicode="false" FixedLength="false" /> 
     </EntityType> 
     </Schema> 
    </edmx:ConceptualModels> 
    <!-- C-S mapping content --> 
    <edmx:Mappings> 
     <Mapping Space="C-S" xmlns="urn:schemas-microsoft-com:windows:storage:mapping:CS"> 
     <EntityContainerMapping StorageEntityContainer="testModelStoreContainer" CdmEntityContainer="testEntities"> 
      <EntitySetMapping Name="People"><EntityTypeMapping TypeName="testModel.Person"><MappingFragment StoreEntitySet="Person"> 
      <ScalarProperty Name="PersonId" ColumnName="PersonId" /> 
      <ScalarProperty Name="TypeCode" ColumnName="TypeCode" /> 
      </MappingFragment></EntityTypeMapping></EntitySetMapping> 
      <EntitySetMapping Name="PersonTypes"><EntityTypeMapping TypeName="testModel.PersonType"><MappingFragment StoreEntitySet="PersonType"> 
      <ScalarProperty Name="PersonTypeId" ColumnName="PersonTypeId" /> 
      <ScalarProperty Name="TypeCode" ColumnName="TypeCode" /> 
      <ScalarProperty Name="TypeDesc" ColumnName="TypeDesc" /> 
      </MappingFragment></EntityTypeMapping></EntitySetMapping> 
     </EntityContainerMapping> 
     </Mapping> 
    </edmx:Mappings> 
    </edmx:Runtime> 

मैं के बीच नेविगेशन प्रॉपर्टी बनाने के लिए edmx को संशोधित करने की कोशिश की है है देखेंगे व्यक्ति टाइप और व्यक्ति लेकिन असफल रहे हैं। मैंने अभी सोचा कि मैं मैन्युअल रूप से कुछ कैसे बना सकता हूं। किसी भी सहायता की सराहना की जाएगी।

+0

मैं वास्तव में आपकी स्कीमा को समझ नहीं पा रहा हूं। यह एक '1-1' सही लगता है? एक व्यक्ति के पास एक विशेष 'व्यक्ति प्रकार' होता है। मुझे समझ में नहीं आता है कि 'पर्सन टाइप' तालिका में 'PersonTypeId' नामक फ़ील्ड क्यों है। यदि यह एक लुकअप टेबल है, तो क्या आपके पास 'टाइपकोड' (पीके), और 'टाइपडेस्क' नहीं होना चाहिए? और फिर 'व्यक्ति' से 'टाइपकोड' पर एफके ठीक काम करेगा, क्योंकि यह एक पीके है। – RPM1984

+0

@ RPM1984 .. उदाहरण सिर्फ एक साधारण उदाहरण है। इसका उपयोग कुछ नहीं है लेकिन समस्या दिखाने के लिए कुछ है। असल में ईएफ आपको गैर-प्राथमिक अनन्य कुंजी का उपयोग करके मॉडल उत्पन्न करने की अनुमति नहीं देगा। –

+0

ठीक है - लेकिन मुझे लगता है कि ईएफ यहां सही काम कर रहा है। यद्यपि क्षेत्र 'अद्वितीय' है, फिर भी एफके को पीके का संदर्भ देना चाहिए, न कि ब्रिटेन। – RPM1984

उत्तर

12

दुर्भाग्यवश अब उम्मीदवार कुंजी पर किसी संगठन को परिभाषित करने का कोई तरीका नहीं है (यानी PersonType.TypeCode)। क्योंकि ईएफ (3.5 और 4.0) एफके में प्राथमिक कुंजी को इंगित करना चाहिए।

his post here से, यह कुछ ऐसा है जो ईएफ टीम अगले संस्करण के लिए विचार कर रही है।

+12

चार साल बाद, अभी भी समर्थित नहीं है (( – AFD

+2

गंभीरता से, लोग इस तरह के "एंटरप्राइज़" ट्रिप का उपयोग कैसे कर सकते हैं। छोड़ा गया LinqToSQL (जो एक बेहतर ओआरएम * प्रारंभ * था और ईएफ 1 बेहतर था। ईएफ 6.1 - भले ही ऐसा वादा किया गया था - अभी भी ऐसे * मूल * आरए सिद्धांत की कमी है। – user2864740

+9

ईएफ 6.1.2 (2015/02) अभी भी समर्थित नहीं है :( –

संबंधित मुद्दे