2009-07-09 74 views
1

我想添加一個屬性到實體框架爲我創建的生成的數據類之一。我在另一個生成的類上做了完全相同的事情,沒有任何問題,並且出於某種原因,它不適用於此類。實體框架:自定義生成的數據對象異常

兩個生成的對象之間唯一的區別是一個是直接表映射(工作的),另一個是從另一個對象(不工作的)繼承的。換句話說一個表代表了兩個實體,並根據某些條件我將它並創建了兩個繼承實體...

<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> 

伊夫然後加入如下屬性...

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"); 
     } 
    } 
} 

現在當ReportPropertyChanged被調用時拋出這個異常:

System.ArgumentException:屬性'SerialNumber'在實體對象上沒有有效的實體映射。有關更多信息,請參閱實體框架文檔。

我在另一個生成的數據類中沒有拋出IDENTICAL代碼,唯一的區別是繼承,發生了什麼?

回答

0

我從來沒有做過這樣的事情,但我注意到它在映射中說「SerialNumberString」和它抱怨的屬性是「SerialNumber」。他們的意思是一樣的嗎?

+0

SerialNumberString被映射到一個只包含數字數據的nvarchar列,所以我添加的SerialNumber屬性包裝了所以我可以使用它作爲一個數字。 – andrej351 2009-07-09 02:30:14

+0

是的,我想說的可能是EF不喜歡的。將「SerialNumber」重命名爲「SerialNumber2」,看看它是否開始抱怨「SerialNumber2」。 – 2009-07-09 02:47:11

0

只是在黑暗中拍攝。 「鑰匙」是保留字嗎?如果是我,我會將該實體名稱更改爲與數據結構相關性較低的內容。

對於故障排除,如果要擴展基類「Product」而不是繼承類,會發生此錯誤嗎?

1

就EF而言,沒有SerialNumber屬性。它知道的唯一財產SerialNumberString

這就是SerialNumberString屬性被更改,而不是SerialNumber

即你想這樣做:ReportPropertyChanged("SerialNumberString");

其實就是在你的代碼多餘的,因爲你在呼喚你的SerialNumber公共SerialNumberString二傳手二傳手即:

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

所以SerialNumberString setter方法調用ReportPropertyChanged("SerialNumberString")反正...所以你應該只是刪除了這一行乾脆:

set 
{ 
    SerialNumberString = value.ToString(); 
} 

希望這有助於

亞歷

順便說一句,你應該也可以在Setter中處理value.HasValue == false