Entity Framework: настройка исключений сгенерированного объекта данных - PullRequest
1 голос
/ 09 июля 2009

Я пытаюсь добавить свойство в один из сгенерированных классов данных, которые 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 не имеет действительного сопоставления сущностей на объекте сущности. Для получения дополнительной информации см. Документацию Entity Framework.

У меня есть ИДЕНТИЧНЫЙ код в другом сгенерированном классе данных, который не выбрасывает, единственная разница - наследование, что происходит ??

Ответы [ 3 ]

1 голос
/ 09 июля 2009

Что касается EF, то свойства SerialNumber нет. Единственное свойство, которое ему известно об этом SerialNumberString.

Так что это свойство SerialNumberString, которое изменяется, а не SerialNumber.

т.е. Вы хотите сделать это: ReportPropertyChanged("SerialNumberString");

Фактически это избыточно в вашем коде, потому что вы вызываете установщик Public SerialNumberString в вашем установщике SerialNumber, т.е.:

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

Так что SerialNumberString установщик все равно вызовет ReportPropertyChanged("SerialNumberString"), так что вам нужно всего лишь удалить эту строку:

set
{
    SerialNumberString = value.ToString();
}

Надеюсь, это поможет

Alex

Кстати, вы, вероятно, должны также обрабатывать value.HasValue == false в сеттере.

0 голосов
/ 09 июля 2009

Просто выстрел в темноте. Является ли «Ключ» зарезервированным словом? Если бы это был я, я бы изменил имя этой сущности на что-то меньшее, связанное со структурами данных.

При поиске и устранении неисправностей возникает ли эта ошибка, если вы должны расширить базовый класс "Product" вместо унаследованного класса?

0 голосов
/ 09 июля 2009

Я никогда раньше такого не делал, но заметил, что в отображении написано "SerialNumberString", а свойство, на которое он жалуется, - "SerialNumber". Они должны быть одинаковыми?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...