Результаты контекста БД показывают «Неверное имя столбца« Дискриминатор »» из унаследованного класса - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь получить контекст базы данных в моем контроллере из модели A, которая подключена к таблице в базе данных, но результаты продолжают ошибаться из-за другой модели B, которая наследуется от модели A. Она включает в себя дополнительные свойства, которые ненаходится в базе данных и не перезаписывает какие-либо свойства из модели А., только дополнительные свойства.

Также я пытаюсь использовать модель В в своем контроллере и не отображать контекстдля модели A (поскольку это подкласс модели A), весь контроллер не функционирует.

Мое приложение работает с ASP.NET Core 2.1 Web API, SQL Server 2012 и IIS Express.

Я видел несколько решений для других вопросов, похожих на этот, для размещения «[NotMapped]» над моделью B и ее дополнительными свойствами.Я пробовал это, и это не сработало.Это все еще показывает ошибку в заголовке.

Я видел, как другие решения говорят, что игнорируют Model B в OnModelCreating (ModelBuilder modelBuilder), помещая "modelBuilder.Ignore ()".Это исключает мою первоначальную ошибку, но выдает еще одну, которая называется «System.InvalidOperationException: невозможно создать DbSet для« ModelB », потому что этот тип не включен в модель для контекста».

Класс контекста базы данных

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DT.Models;

namespace DT.Models
{
    public class DTContext : DbContext
    {
        public DTContext(DbContextOptions<DTContext> options) : base(options) { }

        public DbSet<ModelA> ModelAs { get; set; }
        public DbSet<ModelB> ModelBs { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<ModelA>().ToTable("ModelA");
            //modelBuilder.Ignore<ModelB>();
        }
    }
}

Класс модели A

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Threading.Tasks;

namespace DT.Models
{
    [Description("GET or DELETE using Id")]
    public class ModelA
    {
        public int Id { get; set; }
        public string HotfixID { get; set; }
        public string Description { get; set; }
        public string ExtendedDescription { get; set; }
        public string BugTrackCases { get; set; }
        public string Type { get; set; }
        public string AppVersion { get; set; }
        public DateTime HotfixDate { get; set; }
        public string HotfixLocation { get; set; }
        public int ClientID { get; set; }
        public List<DeploySite> DeploySites { get; set; }
        public List<FBCase> BugTrackCaseList { get; set; }
        public int? OriginalId { get; set; }
        public string CaseType { get; set; }
        public bool HasSQL { get; set; }
        public bool HasConfig { get; set; }
        public bool HasLibraries { get; set; }
        public bool HasWebApps { get; set; }
    }
}

Класс модели B

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Threading.Tasks;

namespace DT.Models
{
    [NotMapped]
    public class ModelB : ModelA
    {
        [NotMapped]
        public string ClientName { get; set; }
        [NotMapped]
        public string Status { get; set; }
        [NotMapped]
        public bool Complete { get; set; }
        [NotMapped]
        public DateTime LastUpdatedDate { get; set; }
    }
}

Контроллер ModelA (только конструктор)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using DT.Models;
using System.Configuration;
using System.Data;

namespace DT.Controllers
{
    [Route("api/modela")]
    [ApiController]
    public class ModelAsController : ControllerBase
    {
        private readonly DTContext _context;

        public ModelAsController(DTContext context)
        {
            _context = context;
        }
     }
}

Вместо того, чтобы видеть все ModelAs в результате _context в конструкторе, вот когда я вижу сообщение об ошибке.

Но когда я раскомментирую "modelBuilder.Ignore ()" в контексте базы данных, в моей консолиЯ вижу ошибку, которую я описал перед тем, как сказать «System.InvalidOperationException: невозможно создать DbSet для« ModelB », потому что этот тип не включен в модель для контекста».Поэтому я не могу игнорировать это, так как он обращается к данным из базы данных.

1 Ответ

0 голосов
/ 19 июня 2019

Я исправил ошибку, поместив все свои дополнительные свойства из ModelB в ModelA, так что мне не нужно использовать ModelB.Теперь это решает проблему контекста, а также использование ModelB, поскольку нам больше не нужно его использовать.

ModelA Class (обновлено)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Threading.Tasks;

namespace DT.Models
{
    [Description("GET or DELETE using Id")]
    public class ModelA
    {
        public int Id { get; set; }
        public string HotfixID { get; set; }
        public string Description { get; set; }
        public string ExtendedDescription { get; set; }
        public string BugTrackCases { get; set; }
        public string Type { get; set; }
        public string AppVersion { get; set; }
        public DateTime HotfixDate { get; set; }
        public string HotfixLocation { get; set; }
        public int ClientID { get; set; }
        public List<DeploySite> DeploySites { get; set; }
        public List<FBCase> BugTrackCaseList { get; set; }
        public int? OriginalId { get; set; }
        public string CaseType { get; set; }
        public bool HasSQL { get; set; }
        public bool HasConfig { get; set; }
        public bool HasLibraries { get; set; }
        public bool HasWebApps { get; set; }
        [NotMapped]
        public string ClientName { get; set; }
        [NotMapped]
        public string Status { get; set; }
        [NotMapped]
        public bool Complete { get; set; }
        [NotMapped]
        public DateTime LastUpdatedDate { get; set; }
    }
}
...