SQL-запрос к реляционной базе данных в Asp.NET Core - PullRequest
0 голосов
/ 04 сентября 2018
public async Task<List<Note>>ShowAssigned()
{
 return await _context.Notes
           .Where(x => x.List.OwnerId != x.OwnerId)
           .ToListAsync()
}

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

Обычно цель : пользователь создает список, а затем некоторые примечания для этого списка. Затем он сможет назначить одну из этих заметок другому пользователю. Когда этот другой пользователь войдет в систему, он сможет увидеть новую записку, которая была ему назначена.

Может кто-нибудь помочь мне с этим?

public class List
{
    public Guid ListId { get; set; }
    public string OwnerId { get; set; }
    public List<Note> Notes { get; set; }
}



public class Note
{
    public Guid ID { get; set; }
    public string OwnerId { get; set; }
    [ForeignKey("ListId")]
    public Guid ListId { get; set; }
    public List List { get; set; }
}

И контекстный класс:

public DbSet<Note> Notes { get; set; }
public DbSet<List> Lists { get; set; }

Когда я пытаюсь получить доступ к данным таким же образом в таком виде:

 @model List<Project.Models.Note>
 @foreach (var item in Model)
{
    if (item.List.OwnerId == item.OwnerId)

Я получаю эту ошибку при запуске веб-приложения (без синтаксических ошибок): NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта

Ответы [ 2 ]

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

Так что я нашел ответ на свою проблему, в некоторых частях с помощью TanvirArjel (но я сделал это по-другому)

 public async Task<List<Note>> GetAssignedItemsAsync(ApplicationUser user)
    {

        var lists = await _context.Lists.Include(l => l.Notes).Where(x => x.OwnerId != user.Id).ToListAsync();

        var notesListe = new List<Note>();

        foreach (List l in lists)
        {
            foreach (Note n in l.Notes)
            {
                if (n.OwnerId == user.Id)
                {
                    notesListe.Add(n);
                }
            }
        }
        return  notesListe;

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

Сначала напишите классы вашей модели следующим образом:

public class List
{
    public Guid ListId { get; set; }
    public string OwnerId { get; set; }

    public virtual List<Note> Notes { get; set; }
}

public class Note
{
    public Guid ID { get; set; }
    public string OwnerId { get; set; }

    [ForeignKey("List")] // Not ListId, its List
    public Guid ListId { get; set; }

    public virtual List List { get; set; }
}

Если ваш проект на ASP.NET Core <2.1 </h2> Затем напишите ваш запрос следующим образом: await _context.Notes.Include(n => n.List).ToListAsync() Если ваш проект на ASP.NET Core> = 2.1

Затем в методе ConfigureServices() в Startup классе:

services.AddDbContext<ApplicationDbContext>(options =>
   options.UseLazyLoadingProxies().UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

Не забудьте установить соответствующую версию Microsoft.EntityFrameworkCore.Proxies пакета nuget, потому что UseLazyLoadingProxies() находится в этом пакете.

Затем напишите ваш запрос следующим образом:

await _context.Notes.ToListAsync()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...