Определить, какое вложенное свойство является нулевым в модели? - PullRequest
0 голосов
/ 02 июля 2019
public class Book
    {
        public string Name { get; set; }        
        public string Description { get; set; }
        public double Price { get; set; }
        public int Stock { get; set; }
        public DateTime DateAdded { get; set; }        
        public int AuthorId { get; set; }
        public  Author Author { get; set; }
        public int CategoryId { get; set; }
        public  Category Category { get; set; }
     }

Запрос к базе данных при активной загрузке возвращает модель, равную нулю, если один из включенных в нее вложенных классов равен нулю.У меня есть сущность книги, у которой есть два подчиненных класса - Автор и Категория .Я хочу идентифицировать вложенную сущность, которая является нулевой, и исключить ее из запроса.Если оба они равны нулю, исключите их обоих и верните только Book с указанным идентификатором.Я выписал следующие лямбда-запросы, но они выглядят немного грубыми, слишком много раз попадают в базу данных и должны быть упрощены.Есть ли лучший способ сделать эту логику более элегантной и упрощенной?

public ActionResult ProductView (int? id)
{
    if (id != null)
    {
        var book = db.Books.Where(b => b.Id == id).Include(b => b.Author).Include(b=> b.Category.Books).SingleOrDefault();
        if(book==null)
        {
            var bookWithCtg = db.Books.Where(b => b.Id == id).Include(b => b.Category).SingleOrDefault();
            var bookWithAuth = db.Books.Where(b => b.Id == id).Include(b => b.Author).SingleOrDefault();

            if (bookWithCtg == null&& bookWithAuth ==null)
                book = db.Books.Where(b => b.Id == id).SingleOrDefault();

            else if(bookWithAuth==null)
                book = db.Books.Where(b => b.Id == id).Include(b => b.Category.Books).SingleOrDefault();

            else if (bookWithCtg == null)
                book = db.Books.Where(b => b.Id == id).Include(b => b.Author).SingleOrDefault();
        }

        book.DisplayNumber++;
        db.SaveChanges();
        return View(book);
    }

    else
       return HttpNotFound();
}

1 Ответ

0 голосов
/ 02 июля 2019

Из-за вашей конфигурации свойств навигации EntityFramework использует внутреннее объединение при объединении книг, автора и категории. Если автор и категория книги могут иметь значение null , необходимо определить AuthorId и CategoryId как nullable int , а также изменить конфигурацию типа объекта следующим образом:

HasOptional(b => b.Author)
 .WithMany(a => a.Books)
 .HasForeignKey(b => b.AuthorId)

HasOptional(b => b.Category)
 .WithMany(a => a.Books)
 .HasForeignKey(b => b.CategoryId)

После этой конфигурации вы можете просто включить автора и категорию.

var book = db.Books
 .Where(b => b.Id == id)
 .Include(b => b.Author)
 .Include(b=> b.Category)
 .SingleOrDefault();

Теперь этот запрос вернет данные книги независимо от автора и категории.

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