实体框架:自定义生成的数据对象异常

时间:2009-07-09 02:10:22

标签: c# entity-framework properties partial-classes

我正在尝试将属性添加到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代码,它没有抛出,唯一的区别是继承,最近发生了什么?

3 个答案:

答案 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”而不是继承的类,是否会发生此错误?