EF Core One ко многим включает - PullRequest
0 голосов
/ 29 мая 2018

Я работаю на веб-сайте ASP.NET Core MVC с EF-CORE, в моей базе данных есть таблица "Doc" и таблица "Signature", один Doc может иметь много подписей, а одна Signature может быть только на DocВот мой код Первая сущность Модель:

Документ:

public class Doc
{
    [Key]
    public int DocID { get; set; }

    [Required]
    public int DocTypeID { get; set; }
    [ForeignKey("DocTypeID")]
    public virtual DocType DocType { get; set; }

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

    [Required]
    public Byte[] Data { get; set; }

    [ForeignKey("DocID")]
    public List<Signature> Signatures { get; set; }
}

Подпись: открытый класс Подпись {

    //FK ITPolicyVersion
    [Key]
    public int DocID { get; set; }
    [ForeignKey("DocID")]
    public virtual Doc Doc { get; set; }

    //FK EmployeeID
    [Key]
    public int EmployeeID { get; set; }
    [ForeignKey("EmployeeID")]
    public virtual Employee Employee { get; set; }


    [Required]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
    [Display(Name = "Signature Date")]
    public DateTime? SignatureDate { get; set; }


    public String Value { get; set; }
}

Но когда я использую этот запрос:

_applicationDBContext.Doc
                            .Include(d => d.DocType)
                            .Include(d => d.Signatures)
                            .OrderBy(d => d.DocType)
                            .ToList();

d.Signatures всегда нулевой, и я не могу понять, почему.

Вот что я пытаюсь сделать в SQL:

Select * from Doc d
join DocType dt on dt.DocTypeID = d.DocTypeID
join Signature s on s.DocID = d.DocID
join Employee e on e.EmployeeID = s.EmployeeID

И это хорошо работает в SQL, но не с LINQ

EDIT

Эта работа:

List<Doc> docs = _applicationDBContext.Doc
                            .Include(d => d.Signatures)
                                .ThenInclude(s=>s.Employee)
                            .Include(d => d.DocType)
                            .ToList();

Но неthis:

List<Doc> docs = _applicationDBContext.Doc
                                .Include(d => d.Signatures)
                                    .ThenInclude(s=>s.Employee)
                                .Include(d => d.DocType)
                                .OrderBy(d => d.DocType)
                                .ToList();

Подпись стала пустой

Как я могу заказать этот список по DocType?

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Взгляните на главную страницу ef, посвященную отношениям .

. Вы должны быть в состоянии упростить что-то вроде этого.

Имейте в виду, что многие вещи работаютпо соглашению, так важно присвоение имен (например, использование идентификатора для ключа объекта автоматически подбирается структурой объекта)

Если у вас есть свойства обратной навигации для дочерних объектов, вам необходим атрибут внешнего ключа и свойство id ИЛИ дляиспользуйте Fluent API.

public class Doc
{
    public int Id { get; set; }

    public DocType DocType { get; set; }

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

    [Required]
    public Byte[] Data { get; set; }

    public List<Signature> Signatures { get; set; }
}

public class Signature {

    public int Id { get; set; }

    //backwards navigation
    public int DocForeignKey {get;set;}
    [ForeignKey("DocForeignKey")]
    public Doc Doc { get; set; }

    public Employee Employee { get; set; }

    [Required]
    [DataType(DataType.Date)]
    [DisplayFormat(DataFormatString = "{0:dd-MM-yyyy}", ApplyFormatInEditMode = true)]
    [Display(Name = "Signature Date")]
    public DateTime? SignatureDate { get; set; }

    public String Value { get; set; }
}
0 голосов
/ 29 мая 2018

На самом деле в заказе была ошибка, но она не была выброшена: DocType - это другая таблица, которая не поддерживает IComparable, поэтому я просто изменяю запрос следующим образом:

List<Doc> docs = _applicationDBContext.Doc
                                .Include(d => d.Signatures)
                                    .ThenInclude(s=>s.Employee)
                                .Include(d => d.DocType)
                                .OrderBy(d => d.DocType.Name)
                                .ToList();

И этоработают отлично.

0 голосов
/ 29 мая 2018

В вашем OnModelCreating DbContext вы поместили отношение Doc и Signature?как то так:

modelBuilder.Entity<Signature>().HasOne(m => m.Doc).WithMany(m => m.Signature).HasForeignKey(m => m.DocID);
...