EF когда добавляете Entity, присоедините это также к ошибке Entity, но с тем же свойством - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть объект такого типа

Компания с сервисом 'n' и Компания с контейнером 'n' с сервисом 'n'

  • Компания (id_s) -> Сервис (id_s, uuid_c)
  • Компания (id_s) -> Контейнер (uuid_c) -> Сервис (id_s, uuid_c)

Когда я добавляю сервис с контейнером в компанию ..У меня 1 сервис и 1 контейнер с 1 сервисом.Когда я добавляю другой сервис, без контейнера (и uuid), к той же компании ... У меня есть 2 сервиса и 1 контейнер с 2 сервисами!: (

Почему это?

Быстрая схема конфигурации моей сущности.

Контейнер:

HasRequired(e => e.company)
                .WithMany(e => e.container)
                .HasForeignKey(e => e.id_company)
                .WillCascadeOnDelete(false);

Служба:

    HasOptional(e => e.container)
                   .WithMany(e => e.services)
                   .HasForeignKey(e => e.uuid_container)
                   .WillCascadeOnDelete(false);

Код для извлечения данных из базы данных

if (!result.Any(x => x.id == cfi.id_company)) 
{ 
    result.Add(cfi.Company); 
} 
else 
{ 
    result.Where(x => x.id == cfi.id_company).FirstOrDefault().result
          .Where(x => x.id == cfi.id_company).FirstOrDefault();             
    a.services.Add(cfi.Company.services.FirstOrDefault()); 
} 

cfi - это список услуг, включая компанию, которая имеет контейнер и услугу

1 Ответ

0 голосов
/ 26 сентября 2018

Честно говоря, я довольно озадачен вашим кодом и не могу понять, что вы пытались сделать.Я постараюсь предоставить правильный подход к вашей проблеме, основываясь на том, как вы описали свои сущности и отношения.

Ваши сущности:

public class Company
{
    public int id { get; set }
    public virtual ICollection<Sevice> Services { get; set; }
    public virtual ICollection<Container> Containers { get; set; }
}

public class Container
{
    public int id { get; set; }
    public int id_company { get; set; }
    public virtual Company company { get; set; }
    public virtual ICollection<Sevice> Services { get; set; }
}

public class Sevice
{
    public int id { get; set; }
    public int? id_company { get; set; }
    public int? id_container { get; set; }
    public virtual Company company { get; set; }
    public virtual Container container { get; set; }
}

Вы сказали, что еще не добавляете какие-либо данные в базу данных, поэтому давайте сосредоточимся на получении существующих данных.

 using (Context context = new Context())
 {
     var company = context.Companies.ToList();
 }

Если вы отключили отложенную загрузку, вам нужно включить ваши дочерние таблицы с include.

 using (Context context = new Context())
 {
     var company = context.Companies.Include(g => g.Services)
                                    .Include(g => g.Containers)
                                    .Include(g => g.Containers.Select(s => s.Services))
                                    .ToList();
 }

Если вы правильно определили отношения, объект вашей компании должен быть правильно загруженвсе объекты.

Если я совершенно неправ о чем-то, дайте мне знать, пока удачи.

Окончательное редактирование

Давайте приведем пример данных

   Company   { id: 1 }
   Container { id: 1, id_company: 1 }
   Service   { id: 1, id_company: 1, id_container: 1 }
   Service   { id: 2, id_company: 1, id_container: null }

Затем с помощью некоторого метода get, подобного следующему:

using (Context context = new Context())
{
    var company = context.Companies.Where(x => x.id == someCompanyId)
                                   .Include(g => g.Services)
                                   .Include(g => g.Containers)
                                   .Include(g => g.Containers.Select(s => s.Services))
                                   .ToList();
}

В результате вы получите объект, который выглядит следующим образом:

  Company
     services: (1, 2)
     containers: (1)
        services: (1)

Где Company - это объект, службы и контейнеры.являются коллекциями объектов.Числа в скобках - это идентификаторы объектов enitity внутри коллекций.Вам не нужно добавлять что-либо, как в коде, который вы опубликовали.

...