2009-07-09 76 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