我正在尝试将属性添加到Entity Framework为我创建的生成的数据类之一。我在另一个生成的类上做了完全相同的事情没有问题,并且由于某种原因它不会在这个上工作。
两个生成对象之间的唯一区别是一个是直接表映射(一个有效),另一个继承自另一个对象(不起作用的对象)。换句话说,一个表代表两个实体,并根据一些标准我已经抽象出来并创建了两个继承实体......
<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 :(得分:1)
就EF而言,没有SerialNumber
属性。它唯一知道的属性SerialNumberString
。
这是更改的SerialNumberString
属性,而不是SerialNumber
。
即。你想这样做:ReportPropertyChanged("SerialNumberString")
;
事实上,在您的代码中,这是多余的,因为您在SerialNumber setter中调用了Public SerialNumberString setter,即:
set
{
SerialNumberString = value.ToString();
ReportPropertyChanged("SerialNumberString");
}
所以SerialNumberString
setter无论如何都会调用ReportPropertyChanged("SerialNumberString")
...所以你应该完全删除该行:
set
{
SerialNumberString = value.ToString();
}
希望这有帮助
亚历
顺便说一句,你应该在Setter中处理value.HasValue == false
。
答案 1 :(得分:0)
我以前从未做过这类事情,但我在映射中注意到它说“SerialNumberString”,它所抱怨的属性是“SerialNumber”。他们的意思是一样的吗?
答案 2 :(得分:0)
在黑暗中拍摄。 “钥匙”是一个保留字吗?如果是我,我会将该实体名称更改为与数据结构不太相关的内容。
对于疑难解答,如果要扩展基类“Product”而不是继承的类,是否会发生此错误?