ASP.Net Core: универсальный контроллер и наследование модели - PullRequest
0 голосов
/ 19 сентября 2019

Я очень noob в C # и экосистеме .NET, извините, если вопрос глупый.

То, что я пытаюсь сделать, это иметь EventController и ArticleController, которые оба наследуются от PageController, то же самоеприменяется для моделей: Event и Article наследуются от Page, используя одну и ту же последовательность идентификаторов.

Я хотел бы предоставить следующие URL-адреса (помимо прочего, но для упрощения):

  • /Страницы (которые показывают статьи и статьи вместе)
  • / Статьи (которые показывают только статьи)
  • / События (которые показывают только события)

Вот упрощенныйКонцепция кода, который я пытаюсь выполнить:

using System;
using CoolSite.Models;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using SharpBusiness.Data;

namespace CoolSite.Models
{
    public abstract class Page
    {
        string Name { get; set; }
        string Description { get; set; }
        string Body { get; set; }
    }

    public class Article : Page
    {
    }

    public class Event : Page
    {
        DateTime When { get; set; }
    }
}

namespace CoolSite.Controllers
{
    public class PageController<T> : Controller where T : Page
    {
        private readonly GeneralContext _db;
        protected GeneralContext Db { get => _db; }

        protected virtual DbSet<T> AllEntities { get => Db.Pages; }

        public PageController(GeneralContext context) => _db = context;

        [HttpGet]
        public IActionResult List() => View(AllEntities);
    }

    public class ArticleController : PageController<Article>
    {
        public ArticleController(GeneralContext context) : base(context) { }
        protected override DbSet<Article> AllEntities { get => Db.Articles; }
    }
    public class EventController : PageController<Event>
    {
        public EventController(GeneralContext context) : base(context) { }
        protected override DbSet<Event> AllEntities { get => Db.Events; }
    }
}

К сожалению, в этой строке:

protected virtual DbSet<T> AllEntities { get => Db.Pages; }

Я получаю эту ошибку:

Не удается неявно преобразовать тип «Microsoft.EntityFrameworkCore.DbSet» в «Microsoft.EntityFrameworkCore.DbSet» (CS0029)

Возможно ли сделать так, чтобы это работало?

Большое спасибо заваша помощь

1 Ответ

1 голос
/ 19 сентября 2019

Вы ищете Set<T>.Хотя не стоит настаивать на этом в иваре, в основном потому, что в этом нет смысла.Если вы хотите сделать запрос, просто используйте _db.Set<T>().При добавлении / удалении сущностей вы можете просто использовать _db.Add(entity), _db.Remove(entity) и т. Д. EF Core выполнит операцию на соответствующем DbSet для этого типа сущности.

...