Две модели, указывающие на одну и ту же таблицу .NET Core - PullRequest
0 голосов
/ 30 ноября 2018

Новое в ядре .NET здесь.Попытка создать структуру модели для размещения следующего:

  • Одна таблица заданий с столбцом jsonb в postgres
  • Несколько типов заданий, каждое из которых будет иметь определенныйСтрока столбца 'type'
  • Каждый тип задания будет иметь свою собственную проверку для столбца json

Сейчас у меня есть две модели.JobsServer.Models.Job и JobsServer.Models.SubJobCategory.SpecificJob.Вот как это выглядит:

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace JobsServer.Models
{
  [Table("jobs")]
  public class Job
  {
    [Column("id"), Key, Required, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id {get; set;}
    [Column("type"), Required]
    public string Type {get; set;}
    [Column("domain"), Required]
    public string Domain {get; set;}
    [Column("status"), Required]
    public string Status {get; set;}
    [Column("data", TypeName = "jsonb")]
    public string Data {get; set;}

    [Column("rescheduled_from_id")]
    public int RescheduledFromId {get; set;}
    [ForeignKey("RescheduledFromId")]
    public Job RescheduledFrom {get; set;}

    [Column("parent_job_id")]
    public int ParentJobId {get; set;}
    [ForeignKey("ParentJobId")]
    public Job ParentJob {get; set;}

  }

}


using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

using JobsServer.Models;

namespace JobsServer.Models.SubJobCategory
{
  [Table("jobs")]
  public class SpecificJob
  {
    [Column("id"), Key, Required, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id {get; set;}
    [Column("type"), Required]
    public string Type {get; set;}
    [Column("domain"), Required]
    public string Domain {get; set;}
    [Column("status"), Required]
    public string Status {get; set;}
    [Column("data", TypeName = "jsonb")]
    public string Data {get; set;}

    [Column("rescheduled_from_id")]
    public int RescheduledFromId {get; set;}
    [ForeignKey("RescheduledFromId")]
    public Job RescheduledFrom {get; set;}

    [Column("parent_job_id")]
    public int ParentJobId {get; set;}
    [ForeignKey("ParentJobId")]
    public Job ParentJob {get; set;}

  }

}

У меня тогда контекст работы выглядит следующим образом:

с использованием Microsoft.EntityFrameworkCore;

с использованием JobsServer.Models;

namespace JobsServer.Contexts
{
  public class JobContext : DbContext
  {
    public JobContext(DbContextOptions<JobContext> options) : base(options)
    {}

    public DbSet<Job> Jobs {get; set;}
    public DbSet<JobsServer.Models.SubJobCategory.SpecificJob> SpecificJob {get; set;}
  }
}

Это дает мне ошибку:

Cannot use table 'jobs' for entity type 'Job' since it is being used for entity type 'SpecificJob' and there is no relationship between their primary keys.

Вероятно, я поступаю неправильно.Я исхожу из рубина на рельсах и в основном из эликсира, где я могу выполнить то, что я пытаюсь сделать здесь.

По сути, если пользователь отправляет сообщение для создания SpecificJob, я планирую установитьвведите 'specific_job', а затем проверьте данные JSON, чтобы соответствовать определенному формату.Конечно, будет несколько типов заданий, но вышеприведенная версия является упрощенной версией для проверки архитектуры.

Любая помощь или идеи приветствуются.

1 Ответ

0 голосов
/ 30 ноября 2018

Шаблон EF, который вы, вероятно, ищете, - это таблица на иерархию, где вы используете наследование для дифференциации типов заданий, представленных в одной таблице заданий с дискриминатором.(«Тип»)

Здесь вы найдете все, что вам нужно: https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-1-table-per-hierarchy-tph

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