• EntityFramework, Linq и очень хитрые сущности. Вопрос по правильному написанию методов CRUD в MVC

    @VanHelSeenG
    Идем с начала:
    Небольшие поправки по классу, чтобы было понятно, что и как должно быть на самом деле
    // основной класс
    public MainClass 
    {
          public MainClassId { get; set; }
    ...
          // отношение один ко многим в FluentApi
         [InverseProperty("MainClassProp")] //обратная связь
          public virtual List<SecondClass> SecondClass { get; set; }
    }
    
    // список из некоторых свойств для основного обьекта
    public SecondClass
    {
         public SecondClassId {get; set; }
        [InversePropert("SecondClass")] //указываем на связь со списком
        public MainClass MainClassProp
    ..
          // отношение один к одному
          [XmlIgnore]
           public Guid ThirdClassId { get; set; }
           [ForeignKey("ThirdClass")] //правильно делать так - указываем на переменную, того же типа, что и ключевое в ThirdClass, для MainClass тоже можно сделать
           public virtual ThirdClass ThirdClass { get; set; }
    }
    
    // категория для SecondClass
    public class ThirdClass
    {
           public Guid ThirdClassId { get; set; }
    ....
    }

    Также про отношения можно почитать здесь, все очень подробно и на русском

    По вопросам:
    1.
    db.MainClasses.Include(s => s.SecondClass).Where(cl => cl.SecondClass.Any(s => s.ThirdClassId == %что-то%);

    (Для .Include() нужно подключить пространство имен using System.Data.Entity, он нужен, чтобы EF подгрузил сразу таблицу с SecondClasses)
    2. Уже,думаю, ответ ясен, нужно просто дальше разобраться
    3. Для такой такой задачи нужно настроить Каскадное удаление, к примеру
    DataContext перегрузить метод
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    //тут строится такая конструкция
    modelBuilder.Entity<MainClass>().HasMany(m => m.SecondClass).WithRequired(s => s.MainClassProp).WIllCascadeOnDelete();
    //а чтобы не удалялись Third class
    modelBuilder.Entity<SecondClass>().HasOptional(или Required)(s => s.ThirdClass).WillCascadeOnDelete(false);
    }

    4(он же 5). Чтобы не создавались новые сущности ThirdClass, нужно явно указывать ссылку на ThirdClass, чтобы EF понял связь, то есть, заранее, нужно сделать выборку
    var res = db.ThirdClasses.FirstOrDefault(t => t.ThirdClassId ==%giud%);
    if (res != null)
    secondClass.ThirdClass = res;


    P.S. на самом деле на сайте мелкомягких кучу разных статей. А так, вот еще одна статья:
    msdn.microsoft.com/ru-ru/data/jj591621.aspx
    Ответ написан
    Комментировать