Как построить модель данных для привязки к таблице SQL со столбцом XML - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь использовать ASP. NET Core для чтения из базы данных SQL. Я использую Microsoft.EntityFrameworkCore.DbContext, и он работает, за исключением любых таблиц, имеющих столбец XML

. При попытке чтения из одной из этих таблиц я получаю следующую ошибку:

System.InvalidOperationException
  HResult=0x80131509
  Message=The entity type 'SqlXml' requires a primary key to be defined. If you intended to use a keyless entity type call 'HasNoKey()'.

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

Как я могу построить модель данных для привязки к таблице SQL со столбцом XML?

DBContext

    public class HistoryContext : DbContext
    {
        public HistoryContext(DbContextOptions<HistoryContext> options) : base(options)
        {

        }

        public DbSet<ShWorkflowRunsModel> shWorkflowRuns { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<ShWorkflowRunsModel>().ToTable("sh_workflowRuns");
        }
    }

Модель

    public class ShWorkflowRunsModel
    {
        [Key]
        public Int64 runId { get; set; }
        public Guid serviceId { get; set; }
        public string serviceName { get; set; }
        public Guid workflowId { get; set; }
        public SqlXml workflowConfig { get; set; }
        public DateTime startTime { get; set; }
        public DateTime endTime { get; set; }
        public bool isScheduled { get; set; }
        public string errorMessage { get; set; }
        public bool hasErrorCounters { get; set; }
    }

Контроллер

    public class WorkflowController : Controller
    {
        private HistoryContext _context;

        public WorkflowController(HistoryContext context)
        {
            _context = context;
        }

        public IActionResult History(string workflowId)
        {
            List<ShWorkflowRunsModel> model = GetShWorkflowRuns(workflowId);
            return View(model);
        }

        public List<ShWorkflowRunsModel> GetShWorkflowRuns(string workflowId)
        {
            return _context.shWorkflowRuns.Where(wr => wr.workflowId.ToString() == workflowId).ToList();
        }

    }
}

Определение таблицы SQL

CREATE TABLE [dbo].[sh_workflowRuns](
    [runId] [bigint] IDENTITY(1,1) NOT NULL,
    [serviceId] [uniqueidentifier] NOT NULL,
    [serviceName] [nvarchar](1024) NULL,
    [workflowId] [uniqueidentifier] NOT NULL,
    [workflowConfig] [xml] NOT NULL,
    [startTime] [datetime] NULL,
    [endTime] [datetime] NULL,
    [isScheduled] [bit] NULL,
    [errorMessage] [nvarchar](1024) NULL,
    [hasErrorCounters] [bit] NULL,
 CONSTRAINT [PK_sh_workflowRuns] PRIMARY KEY CLUSTERED 
(
    [runId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация

1 Ответ

0 голосов
/ 01 февраля 2020

Вы получаете это сообщение об ошибке, потому что EF Core считает, что SqlXml является одной из ваших сущностей, и пытается сопоставить его с таблицей БД, и, очевидно, он не может найти никакого идентификатора в классе SqlXml.

Не думаю, что текущая версия EF Core имеет встроенную поддержку XML. Вы должны прочитать и записать это как строку, и вы можете создать оболочку, как они это делают в следующих примерах:

XML столбцы в приложении Code-First

Поддерживает ли Entity Framework 6.1 собственный тип данных XML?

https://social.msdn.microsoft.com/Forums/en-US/a2e6aa49-f573-4dca-a1e7-505841c3c668/entity-framework-treats-xml-type-in-sql-server-as-a-string?forum=adodotnetentityframework

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