#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-скрипт. Спасибо!!