Ошибка компиляции Entity Framework. Класс нельзя использовать как скалярное свойство, потому что у него нет методов получения и установки

С Code First подход и реализация базы данных для существующей системы. Поэтому я не могу внести много изменений в существующий код. Вот почему я использую Fluent API и Entity Framework.

Когда я пытаюсь реализовать новый класс (Vector), который используется несколькими другими классами, я получаю ошибку компиляции:

The relationship 'Price_Data' was not loaded because the type 'Vector' is not available.
The following information may be useful in resolving the previous error:
The property 'Item' of type 'Vector' in the assembly 'Core, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' cannot be used as a scalar property because it does not have both a getter and setter.

Поскольку я довольно новичок в.NET (из Java), я не знаю, с чего начать поиск ошибки.

Кто-нибудь здесь знает почему и как это исправить?

3 ответа

Решение

Я узнал, почему это происходит.

Vectorимеет Indexerсобственность, ака public var this[], Благодаря другому сообщению Stackru.

На данный момент Fluent API не может справиться с такой проблемой, и самый простой способ решения этой проблемы - использовать аннотацию данных и [NotMapped],

Результирующий код будет выглядеть примерно так:

class Vector
{
    [NotMapped]
    public var this[]
    {
    }
}

Я хотел бы поблагодарить всех, кто нашел время, пытаясь помочь мне с этим вопросом.

Если вы внимательно прочитаете сообщение об ошибке, проблема станет ясной:

Свойство 'Item' типа 'Vector' в сборке 'Core, Version=0.0.0.0, Culture= нейтральный, PublicKeyToken=null' нельзя использовать в качестве скалярного свойства, поскольку оно не имеет ни метода получения, ни установки.

Твой класс Vector имеет свойство Item который имеет геттер или сеттер, но не оба, и Entity Framework для корректной работы необходимы свойства чтения-записи.

Несвязанное примечание: предложение

Если ваши доменные объекты не имеют своих свойств, помеченных как виртуальные (т.е. public virtual string PropertyName), вы не собираетесь использовать ленивую загрузку, это означает, что ваши запросы будут загружать весь набор результатов, что приводит к очень неэффективному вводу-выводу данных (больший сетевой трафик, большее время загрузки и, в конце день, более медленные приложения / услуги).

Если я могу быть настолько смелым, ошибка вроде бы ясно говорит: свойство Item в типе Vector (в сборке Core) не имеет обоих get а также set пункт. Он понадобится, если вы хотите использовать его с EF.

Другие вопросы по тегам