Выражение свойств недопустимо. Выражение должно представлять свойство

entity-framework-6

Вопрос

У меня есть эти два объекта

public class Song : IPathHavingEntity
    {
        public int Id { get; set; }
        [Required]
        public string Path { get; set; }
        [Required]
        public virtual Album Album { get; set; }
        [Required]
        public int TrackNumber { get; set; }
    }

public class Album : IPathHavingEntity
    {
        public int Id { get; set; }
        [Required]
        public string Path { get; set; }
        public virtual IEnumerable<Song> Songs { get; set; }
        [Required]
        public int AlbumNumber { get; set; }
    }

Path определяется в интерфейсе IPathHavingEntity .

В методе Seed я хочу добавить песню в таблицу Songs только в том случае, если она не существует. По этой причине я проверяю, что путь пути к альбому и комбинация пути песни не существуют уже до их добавления

public class Song : IPathHavingEntity
    {
        public int Id { get; set; }
        [Required]
        public string Path { get; set; }
        [Required]
        public virtual Album Album { get; set; }
        [Required]
        public int TrackNumber { get; set; }
    }

public class Album : IPathHavingEntity
    {
        public int Id { get; set; }
        [Required]
        public string Path { get; set; }
        public virtual IEnumerable<Song> Songs { get; set; }
        [Required]
        public int AlbumNumber { get; set; }
    }

Проблема в том, что я получаю эту ошибку

The properties expression 's => new <>f__AnonymousType0``2(FilePath = s.Path, AlbumPath = s.Album.Path)' is not valid. The expression should represent a property: C#: 't => t.MyProperty' VB.Net: 'Function(t) t.MyProperty'. When specifying multiple properties use an anonymous type: C#: 't => new { t.MyProperty1, t.MyProperty2 }' VB.Net: 'Function(t) New With { t.MyProperty1, t.MyProperty2 }'.

В чем проблема?

Принятый ответ

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

Проблема может быть вызвана тем, что свойство Album вашего объекта Song помечено как virtual . Я не эксперт EF, но я не думаю, что ему нравится это virtual свойство при инициализации вашего анонимного типа. Добавьте не виртуальное свойство для пути к альбому (но сохраните свойство virtual навигации), например:

public class Song : IPathHavingEntity
{
    public int Id { get; set; }

    [Required]
    public string Path { get; set; }

    [Required]
    public virtual Album Album { get; set; }

    public string AlbumPath { get; set; }

    [Required]
    public int TrackNumber { get; set; }
}

А затем выполните AddOrUpdate используя это не виртуальное свойство, например:

public class Song : IPathHavingEntity
{
    public int Id { get; set; }

    [Required]
    public string Path { get; set; }

    [Required]
    public virtual Album Album { get; set; }

    public string AlbumPath { get; set; }

    [Required]
    public int TrackNumber { get; set; }
}

EF должен позволять вам добавлять песни, в которых данный путь песни и путь к альбому еще не существует. Другой вопрос, может ли ваш объект домена Song иметь не виртуальное свойство AlbumPath но это должно по крайней мере позволить вам запустить ваш метод семени в том виде, как вы описали.


Популярные ответы

В моем случае «Единственная модификация, которую я сделал, что в модельных классах забыла поставить {get; set;} с объявлением свойства, таким образом ... Это решило мою проблему.

Как это:

До:

 public int Supplier_ID;
 public String Supplier_Code;

После:

 public int Supplier_ID;
 public String Supplier_Code;

Не забудьте проверить, что ваши классы моделей должны иметь свойство Get/Set




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему