2009-07-09 3 views
1

Ich versuche eine Eigenschaft zu einer der generierten Datenklassen hinzuzufügen, die das Entity Framework für mich erstellt hat. Ich habe die gleiche Sache an einer anderen generierten Klasse ohne ein Problem gemacht und aus irgendeinem Grund wird es bei dieser nicht funktionieren.Entity Framework: Anpassen der generierten Datenobjektausnahme

Der einzige Unterschied zwischen den beiden generierten Objekten ist, dass es sich nur um eine direkte Tabellenzuordnung handelt (die eine, die funktioniert) und die andere von einem anderen Objekt (das nicht funktioniert). Mit anderen Worten: eine Tabelle stellt zwei Entitäten und auf der Grundlage einiger Kriterien i es abstrahiert haben und erstellt zwei Vererbungs Einheiten ...

<EntityType Name="Product" Abstract="true"> 
    <Key> 
     <PropertyRef Name="Id" /> 
    </Key> 
    <Property Name="Id" Type="String" Nullable="false" /> 
</EntityType> 
<EntityType Name="Key" BaseType="MyEntities.Product"> 
    <Property Name="Status" Type="String" Nullable="true" /> 
    <Property Name="SerialNumberString" Type="String" Nullable="true" /> 
</EntityType> 
<EntityType Name="License" BaseType="MyEntities.Product" > 
    <Property Name="ProductCode" Type="String" Nullable="true" /> 
    <Property Name="Version" Type="String" Nullable="true" /> 
</EntityType> 

Ive dann die Eigenschaft hinzugefügt folgt ...

public partial class Key 
{ 
    public int? SerialNumber 
    { 
     get 
     { 
      int serialNumber; 
      if (int.TryParse(SerialNumberString, out serialNumber)) 
      { 
       return serialNumber; 
      } 

      return null; 
     } 

     set 
     { 
      SerialNumberString = value.ToString(); 
      ReportPropertyChanged("SerialNumber"); 
     } 
    } 
} 

Wenn ReportPropertyChanged jetzt aufgerufen wird, wird die Ausnahme ausgelöst:

System.ArgumentException: Die Eigenschaft 'SerialNumber' hat keine gültige Entitätszuordnung für das Entitätsobjekt. Weitere Informationen finden Sie in der Entity Framework-Dokumentation.

Ich habe IDENTICAL-Code in einer anderen generierten Datenklasse, die nicht wirft, der einzige Unterschied ist die Vererbung, was los ist ??

Antwort

0

Ich habe so etwas noch nie gemacht, aber ich merke in der Zuordnung "SerialNumberString" und die Eigenschaft, über die es sich beschweren ist "SerialNumber". Sollen sie gleich sein?

+0

SerialNumberString ist einer nvarchar -Spalte zugeordnet, die nur numerische Daten enthält. Daher fügt meine hinzugefügte SerialNumber-Eigenschaft das Wrapping ein, sodass ich sie als Zahl verwenden kann. – andrej351

+0

Ja, und ich sage vielleicht, dass EF das nicht mag.Benennen Sie "SerialNumber" in "SerialNumber2" um und sehen Sie, ob es sich über die "SerialNumber2" beschwert. –

+0

yeh es tut, unabhängig von Name – andrej351

0

Nur ein Schuss im Dunkeln. Ist "Key" ein reserviertes Wort? Wenn ich es wäre, würde ich diesen Entitätsnamen in etwas ändern, das weniger mit den Datenstrukturen verwandt ist.

Tritt dieser Fehler bei der Fehlerbehebung auf, wenn Sie die Basisklasse "Product" statt der geerbten Klasse erweitern?

+0

Der Name "Key" ist nicht das Problem, da die Entitäten in dieser Struktur für ein paar Wochen in Ordnung waren, bevor Sie versuchen, dies zu implementieren. Ich habe versucht, die Eigenschaft zu einer Teilausdehnung der Produktklasse hinzufügen und es warf die gleiche Zeile ('Set' hatte gerade einen Aufruf von ReportPropertyChanged als SerialNumberString nicht in Produkt vorhanden). – andrej351

1

Was die EF betrifft, gibt es keine SerialNumber Eigenschaft. Die einzige Eigenschaft, die es darüber kennt SerialNumberString.

Das ist also die SerialNumberString Eigenschaft, die geändert wird, nicht die SerialNumber.

Sie möchten dies tun: ReportPropertyChanged("SerialNumberString");

In der Tat, die in Ihrem Code überflüssig ist, weil Sie die öffentlichen SerialNumberString Setter in Ihrer Serial Setter dh anrufen:

set 
{ 
    SerialNumberString = value.ToString(); 
    ReportPropertyChanged("SerialNumberString"); 
} 

So SerialNumberString Setter wird ReportPropertyChanged("SerialNumberString") sowieso nennen ... so sollten Sie entfernen Sie einfach die Zeile insgesamt:

set 
{ 
    SerialNumberString = value.ToString(); 
} 

this helps

Alex

BTW sollten Sie wahrscheinlich value.HasValue == false im Setter auch behandeln.