2011-07-01 15 views
120

मेरे पास SENTries नामक मेरे डेटाबेस में एक तालिका है (CREATE तालिका कथन के नीचे देखें)। इसकी प्राथमिक कुंजी है, कुछ विदेशी कुंजी और इसके बारे में कुछ खास नहीं है। मेरे डेटाबेस में मेरे पास कई टेबल हैं, लेकिन किसी कारण से, यह तालिका ईएफ प्रॉक्सी क्लास पर "डिस्कमिनेटर" कॉलम के साथ समाप्त हुई।ईएफ कोड पहला "अमान्य कॉलम नाम 'डिस्कमिनेटर'" लेकिन कोई विरासत

System.Data.SqlClient.SqlException: Invalid column name 'Discriminator'. 

यह समस्या केवल तभी होती है:

public class SEntry 
{ 
    public long SEntryId { get; set; } 

    public long OriginatorId { get; set; } 
    public DateTime DatePosted { get; set; } 
    public string Message { get; set; } 
    public byte DataEntrySource { get; set; } 
    public string SourceLink { get; set; } 
    public int SourceAppId { get; set; } 
    public int? LocationId { get; set; } 
    public long? ActivityId { get; set; } 
    public short OriginatorObjectTypeId { get; set; } 
} 

public class EMData : DbContext 
{ 
    public DbSet<SEntry> SEntries { get; set; } 
      ... 
    } 

जब मैं उस मेज पर एक नई पंक्ति जोड़ने की कोशिश, मैं त्रुटि मिलती है:

यह कैसे वर्ग सी # में घोषित किया जाता है आप किसी अन्य वर्ग से अपने सी # वर्ग को विरासत में ले रहे हैं, लेकिन सेन्ट्री किसी भी चीज़ से विरासत में नहीं है (जैसा कि आप ऊपर देख सकते हैं)।

कि के अलावा, एक बार मैं डिबगर पर उपकरण की नोक मिलता है जब मैं संतरियों संपत्ति के लिए EMData उदाहरण पर माउस, यह प्रदर्शित करता है:

base {System.Data.Entity.Infrastructure.DbQuery<EM.SEntry>} = {SELECT 
[Extent1].[Discriminator] AS [Discriminator], 
[Extent1].[SEntryId] AS [SEntryId], 
[Extent1].[OriginatorId] AS [OriginatorId], 
[Extent1].[DatePosted] AS [DatePosted], 
[Extent1].[Message] AS [Message], 
[Extent1].[DataEntrySource] AS [DataE... 

किसी भी सुझाव या विचार जहां को पाने के लिए इस मुद्दे के नीचे? मैंने टेबल, प्राथमिक कुंजी और कुछ अन्य चीजों का नाम बदलने की कोशिश की, लेकिन कुछ भी काम नहीं करता है।

एसक्यूएल-तालिका:

CREATE TABLE [dbo].[SEntries](
[SEntryId] [bigint] IDENTITY(1125899906842624,1) NOT NULL, 
[OriginatorId] [bigint] NOT NULL, 
[DatePosted] [datetime] NOT NULL, 
[Message] [nvarchar](500) NOT NULL, 
[DataEntrySource] [tinyint] NOT NULL, 
[SourceLink] [nvarchar](100) NULL, 
[SourceAppId] [int] NOT NULL, 
[LocationId] [int] NULL, 
[ActivityId] [bigint] NULL, 
[OriginatorObjectTypeId] [smallint] NOT NULL, 
CONSTRAINT [PK_SEntries] PRIMARY KEY CLUSTERED 
(
[SEntryId] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,  ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[SEntries] WITH CHECK ADD CONSTRAINT [FK_SEntries_ObjectTypes] FOREIGN KEY([OriginatorObjectTypeId]) 
REFERENCES [dbo].[ObjectTypes] ([ObjectTypeId]) 
GO 

ALTER TABLE [dbo].[SEntries] CHECK CONSTRAINT [FK_SEntries_ObjectTypes] 
GO 

ALTER TABLE [dbo].[SEntries] WITH CHECK ADD CONSTRAINT [FK_SEntries_SourceApps] FOREIGN KEY([SourceAppId]) 
REFERENCES [dbo].[SourceApps] ([SourceAppId]) 
GO 

ALTER TABLE [dbo].[SEntries] CHECK CONSTRAINT [FK_SEntries_SourceApps] 
GO 
+11

अगले व्यक्ति के लिए जो इसे समझने का प्रयास करने में कुछ समय व्यतीत करेगा, क्या हुआ कि कोड पर किसी अन्य स्थान पर, मेरे पास एक वर्ग था जो सेन्ट्री से विरासत में मिला, भले ही यह एक वर्ग न हो कभी डीबी पर संग्रहीत किया जाएगा। तो मुझे बस इतना करना था कि उस वर्ग की विशेषता के रूप में [NotMapped] को जोड़ना था! –

उत्तर

256

बाहर कर देता है कि इकाई की रूपरेखा समझेंगे कि किसी भी वर्ग है कि एक POCO वर्ग कि डेटाबेस पर एक मेज पर मैप किया गया है से विरासत एक Discriminator स्तंभ की आवश्यकता है, यहां तक ​​कि व्युत्पन्न वर्ग करता है, तो डीबी में सहेजा नहीं जाएगा।

समाधान काफी सरल है और आपको व्युत्पन्न कक्षा की विशेषता के रूप में [NotMapped] जोड़ने की आवश्यकता है।

उदाहरण:

class Person 
{ 
    public string Name { get; set; } 
} 

[NotMapped] 
class PersonViewModel : Person 
{ 
    public bool UpdateProfile { get; set; } 
} 

अब, भले ही आप डेटाबेस पर व्यक्ति मेज पर व्यक्ति वर्ग के नक्शे, एक "Discriminator" कॉलम क्योंकि व्युत्पन्न वर्ग [NotMapped] है नहीं बनाया जाएगा।

एक अतिरिक्त टिप के रूप में, आप उन गुणों के लिए [NotMapped] का उपयोग कर सकते हैं जिन्हें आप डीबी पर किसी फ़ील्ड में मैप करना नहीं चाहते हैं।

+5

ठीक है तो मेरे जीवन के 3 घंटे चलते हैं; (लेकिन सभी को समान बनाते हैं। मुझे बस स्पष्ट होने के लिए भी जोड़ना चाहिए ... व्युत्पन्न कक्षाएं किसी भी तरह से कोने में नहीं हो सकती हैं: दृढ़ता और ईएफ अभी भी कोशिश करेगा और उन्हें आकर्षित करेगा ... बहुत भ्रमित। – rism

+11

यदि आपको [NotMapped] नहीं मिलता है, तो कृपया "असेंबली फ्रेमवर्क" से परियोजना में "System.ComponentModel.DataAnnotations" का संदर्भ जोड़ें। – XandrUu

+8

सिस्टम का उपयोग कर। ComponentModel.DataAnnotations.Schema; – ygaradon

40

यहां फ़्लुएंट एपीआई वाक्यविन्यास है।

http://blogs.msdn.com/b/adonet/archive/2010/12/06/ef-feature-ctp5-fluent-api-samples.aspx

class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string FullName { 
     get { 
      return this.FirstName + " " + this.LastName; 
     } 
    } 
} 

class PersonViewModel : Person 
{ 
    public bool UpdateProfile { get; set; } 
} 


protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    // ignore a type that is not mapped to a database table 
    modelBuilder.Ignore<PersonViewModel>(); 

    // ignore a property that is not mapped to a database column 
    modelBuilder.Entity<Person>() 
     .Ignore(p => p.FullName); 

} 
+1

किसी संपत्ति को अनदेखा करने के तरीके को इंगित करने के लिए धन्यवाद – Adi

+0

क्या यह '[NotMapped]' विशेषता जोड़ने के लिए बेहतर नहीं होगा? – Keith

+1

@ मेरा जवाब यह है कि फ़्लुएंट एपीआई का उपयोग करके कॉलम को अनदेखा करना है, जो [नोटमैपड] –

6

मैं सिर्फ इस का सामना करना पड़ा और मेरी समस्या दोनों System.ComponentModel.DataAnnotations.Schema.TableAttribute एक ही मेज की चर्चा करते हुए के साथ दो संस्थाओं के होने की वजह से किया गया था।

उदाहरण के लिए

:

[Table("foo")] 
public class foo 
{ 
    // some stuff here 
} 

[Table("foo")] 
public class fooExtended 
{ 
    // more stuff here 
} 

मेरे लिए foo_extended को foo से एक दूसरे के इस तय बदल रहा है और मैं अब प्रति प्रकार टेबल (टीपीटी) का उपयोग कर रहा

+0

यह मेरे लिए काम नहीं करता है: 'इकाई प्रकार' एटेंसीन मेडिका 'और' एटेंसीन मेडिकाएप 'तालिका' एटेंसीन मेडिकस 'साझा नहीं कर सकता क्योंकि वे एक ही प्रकार के पदानुक्रम में नहीं हैं –

+0

धन्यवाद, मेरी मदद की, धाराप्रवाह एपीआई का उपयोग करके एक ही समस्या थी: 'var entity = modelbuilder.Entity ()। ToTable (" ENTITY_TABLE ")', और फिर एक ही पंक्ति 'EntityObject' या समान 'ENTITY_TABLE' का उपयोग कर। –

1

मैं एक स्थिति में त्रुटि मिलती है,

:

2 कक्षाएं एक ही आधार वर्ग नामित LevledItem से ली गई है: और यहाँ समस्या और समाधान कर रहे हैं

लेकिन उनकी DbContext में, मैं कुछ कोड की नकल की है, लेकिन वर्ग के नाम में से एक को बदलने के लिए भूल जाते हैं:

public class MFCTeamDbContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     //Other codes here 
     modelBuilder.Entity<LeveledItem>() 
      .Map<Team>(m => m.Requires("Type").HasValue(ItemType.Team)); 
    } 

public class ProductBacklogDbContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     //Other codes here 
     modelBuilder.Entity<LeveledItem>() 
      .Map<Team>(m => m.Requires("Type").HasValue(ItemType.Story)); 
    } 

हाँ, दूसरा मानचित्र < टीम> मानचित्र < कहानी होना चाहिए>। और इसे समझने के लिए मुझे आधा दिन खर्च हुआ!

2

अन्य परिदृश्य जहां ऐसा होता है कि आप एक आधार वर्ग और एक या अधिक उपवर्गों, जहां उपवर्गों की कम से कम एक अतिरिक्त गुण का परिचय है जब:

class Folder { 
    [key] 
    public string Id { get; set; } 

    public string Name { get; set; } 
} 

// Adds no props, but comes from a different view in the db to Folder: 
class SomeKindOfFolder: Folder { 
} 

// Adds some props, but comes from a different view in the db to Folder: 
class AnotherKindOfFolder: Folder { 
    public string FolderAttributes { get; set; } 
} 

इन DbContext नीचे की तरह में मैप रहे हैं, तो " 'अमान्य स्तंभ नाम' Discriminator '" त्रुटि तब होती है जब किसी भी प्रकार Folder आधार प्रकार के आधार पर पहुँचा जा सकता है:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Folder>().ToTable("All_Folders"); 
    modelBuilder.Entity<SomeKindOfFolder>().ToTable("Some_Kind_Of_Folders"); 
    modelBuilder.Entity<AnotherKindOfFolder>().ToTable("Another_Kind_Of_Folders"); 
} 

मुझे लगता है कि पाया समस्या को हल करने के लिए, हम Folder के रंगमंच की सामग्री को निकालने एक आधार वर्ग इतना की तरह (जो OnModelCreating() में मैप नहीं है) के लिए - OnModelCreating अपरिवर्तित होना चाहिए:

class FolderBase { 
    [key] 
    public string Id { get; set; } 

    public string Name { get; set; } 
} 

class Folder: FolderBase { 
} 

class SomeKindOfFolder: FolderBase { 
} 

class AnotherKindOfFolder: FolderBase { 
    public string FolderAttributes { get; set; } 
} 

यह समस्या समाप्त, लेकिन मैं पता नहीं क्यों!

+0

यह सुंदर व्युत्पन्न कक्षाओं को बेकार हालांकि प्रस्तुत करता है ... – Jerther

1

क्योंकि मैं निम्नलिखित

  1. किया इस त्रुटि मेरे साथ हो रहा डेटाबेस
  2. में तालिका के स्तंभ का नाम बदल (मैं edmx में Update Model from database इस्तेमाल किया नहीं था) मैं में परिवर्तन मैच के लिए मैन्युअल रूप से प्रॉपर्टी का नाम का नाम बदला डेटाबेस स्कीमा
  3. मैं डेटाबेस स्कीमा और edmx में मॉडल के रूप में ही कुछ पुनर्रचना के वर्ग में संपत्ति के नाम बदलने के लिए किया था

अल हालांकि इस के एल, मुझे यह त्रुटि

मिला तो what to do

  1. मैं edmx
  2. से
  3. मॉडल हटाए गए राइट क्लिक करें और Update Model from database

इस मॉडल पुन: उत्पन्न होगी, और इकाई की रूपरेखा willgive you this error

एच ओपे इस मदद से आपको

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