Воспроизведение первичного ключа, кластеризованного в ModelBuilder с несколькими столбцами

#c# #visual-studio #entity-framework-core

#c# #visual-studio #сущность-фреймворк-ядро

Вопрос:

Я работаю с таблицей, которую мне нужно сначала воссоздать в коде Visual Studio Core. Таблица содержит четыре кластеризованных ключа. Если я создам таблицу в SQL Management Studio, она будет выглядеть следующим образом:

 CREATE TABLE [dbo].[apptmt_t](
    [acctno] [decimal](10, 0) NOT NULL,
    [patno] [decimal](1, 0) NOT NULL,
    [chgslipno] [decimal](9, 0) NOT NULL,
    [sequence] [char](1) NOT NULL,

    [appt_date] [datetime] NULL,
    [appt_time_actual] [decimal](4, 0) NULL,
    [appt_time] [decimal](4, 0) NULL,
 CONSTRAINT [PK_apptmt_t] PRIMARY KEY CLUSTERED 
(
    [acctno] ASC,
    [patno] ASC,
    [chgslipno] ASC,
    [sequence] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
  

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

     [Table("apptmt_t")]
    public partial class ApptMtt
    {
        [Key]
        [Column("acctno", TypeName = "decimal(10,0)", Order = 0)]
        public decimal AcctNo { get; set; }

        [Key]
        [Column("patno", TypeName = "decimal(1,0)", Order = 1)]
        public decimal PatNo { get; set; }

        [Key]
        [Column("chgslipno", TypeName = "decimal(9,0)", Order = 2)]
        public decimal ChgSlipNo { get; set; }

        [Key]
        [Column("sequence", TypeName = "char(1)", Order = 3)]
        public char Sequence { get; set; }

        [Column("appt_date", TypeName = "datetime")]
        public DateTime? ApptDate { get; set; }

        [Column("appt_time_actual", TypeName = "decimal(4,0)")]
        public decimal ApptTimeActual { get; set; }

        [Column("appt_time", TypeName = "decimal(4,0)")]
        public decimal ApptTime { get; set; }
    }
  

В моем контекстном файле я несколько раз пытался сопоставить кластеризацию, но безуспешно. Любая помощь была бы оценена.

             modelBuilder.Entity<ApptMtt>(entity =>
            {
                entity.HasKey(e => e.AcctNo).ForSqlServerIsClustered(true);
                entity.HasIndex(e => e.AcctNo).HasName("acctno");

                entity.HasKey(e => e.PatNo).ForSqlServerIsClustered(true);
                entity.HasIndex(e => e.PatNo).HasName("patno");

                entity.HasKey(e => e.ChgSlipNo).ForSqlServerIsClustered(true);
                entity.HasIndex(e => e.ChgSlipNo).HasName("chgslipno");

                entity.HasKey(e => e.Sequence).ForSqlServerIsClustered(true);
                entity.HasIndex(e => e.Sequence).HasName("sequence");
                entity.Property(e => e.Sequence).IsUnicode(false);
          }
  

Ответ №1:

Исходя из вашего описания, вы хотите создать первичный ключ, кластеризованный в ModelBuilder с несколькими столбцами.

Вам нужно добавить OnModelCreating метод в ваш класс datacontext.

 public class MyContext:DbContext
    {
        public DbSet<ApptMtt> Customers { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder
                .UseSqlServer(@"Connstring");
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<ApptMtt>()
                .HasKey(c => new { c.AcctNo,c.ChgSlipNo,c.PatNo,c.Sequence });
        }
    }
  

Результат:

введите описание изображения здесь

Комментарии:

1. Я обновил контекст, чтобы соответствовать вашему примеру выше: « ModelBuilder. Сущность<ApptMtt>(сущность => { entity. hasKey(e => new { e.AcctNo, e.PatNo, e.ChgSlipNo, e.Sequence}); « Когда я создаю SQL с использованием миграции, я получаю следующие две строки: « ОГРАНИЧЕНИЕ [PK_apptmt_t] ПЕРВИЧНЫЙ КЛЮЧ ([acctno], [patno], [chgslipno], [sequence]), ОГРАНИЧЕНИЕ [ AK_apptmt_t_acctno_chgslipno_patno_sequence] УНИКАЛЬНЫЙ ([acctno], [chgslipno], [patno], [последовательность]) «` Первое ограничение верно, но как мне снять второе ограничение?

2. Я понял, что мне нужно просто удалить дополнительную строку ограничения в сценарии миграции. Это позволило мне получить правильный SQL-скрипт. Спасибо!!