繁体   English   中英

ASP.Net 核心:通用 Controller & Model Inheritance

[英]ASP.Net Core : Generic Controller & Model Inheritance

我在 C# 和 .NET 生态系统中非常菜鸟,如果问题愚蠢,对不起。

我想要做的是拥有一个EventControllerArticleController ,它们都继承自PageController ,同样适用于模型: Event 和 Article 继承自 Page,共享相同的 ID 序列。

我想提供这些网址(除其他外,但为了简化):

  • /Pages(同时显示文章和页面)
  • /Articles(仅显示文章)
  • /Events(仅显示事件)

这是我要完成的代码的简化概念:

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)

有可能使它起作用吗?

非常感谢您的帮助

您正在寻找Set<T> 虽然,您不应该在 ivar 中坚持这一点,主要是因为没有意义。 当您想查询时,只需使用_db.Set<T>() 添加/删除实体时,您可以只使用_db.Add(entity)_db.Remove(entity)等。EF Core 将为该实体类型在适当的DbSet上执行操作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM