Невозможно вставить повторяющийся ключ в объект - Как создать составной ключ в Entity Framework Core - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть требование создать composite ключ, используя Entity Framework Core

Это мой класс

public partial class MasterType
{
    [DataMember(Name = "Id")]
    [Key]
    public string Id { get; set; }

    [Required]
    [DataMember(Name = "Name")]
    [Key]
    public string Name { get; set; }
}

Вот мой класс Configuration, который помогает мне создавать composite properties

public class MasterTypeConfigurations : BaseEntityConfigurations<MasterType>
{
    public override void Configure(EntityTypeBuilder<MasterType> builder)
    {
       base.Configure(builder); 
       // composite key
       builder.HasKey(c => new { c.Id, c.Name});
    }
}

Я использую migration возможность ядра инфраструктуры сущностей

Вот сгенерированный сценарий миграции

  migrationBuilder.CreateTable(
            name: "MasterTypes",
            columns: table => new
            {
                Id = table.Column<string>(nullable: false),
                Name = table.Column<string>(nullable: false)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_MasterTypes", x => new { x.Id, x.Name });                 
            });

Но когда я выполняювставить SQL, я получаю ошибку

 INSERT INTO [dbo].[MasterTypes] ([Id] ,[Name]) VALUES  ('CA8301','Type1')
 INSERT INTO [dbo].[MasterTypes] ([Id] ,[Name]) VALUES  ('CA8301','Type2')

Невозможно вставить дубликат ключа в объект.Дубликат значения ключа (C8301, C8301).

Почему он не объединяет Name.Потому что Name это uniqie

1 Ответ

0 голосов
/ 22 февраля 2019

Доступно руководство по этой ссылке: Составные ключи

Entity Framework Core поддерживает составные ключи - значения первичных ключей, сгенерированные из двух или более полей в базе данных.Однако, в отличие от предыдущих версий Entity Framework, вы не можете использовать атрибут Key для определения составных ключей.Это можно сделать только через Fluent API.

class Program
{
    static void Main(string[] args)
    {
        using (var db=new SampleContext())
        {
            db.Database.EnsureCreated();
            db.MasterTypes.Add(new MasterType()
            {
                Id = "CA8301",
                Name = "Type1"
            });
            db.MasterTypes.Add(new MasterType()
            {
                Id = "CA8301",
                Name = "Type2"
            });
            db.SaveChanges();
        }
    }
}

public class SampleContext : DbContext
{
    public DbSet<MasterType> MasterTypes { get; set; }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<MasterType>()
            .HasKey(o => new { o.Id, o.Name});
    }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("Server=.;Database=MyDb;Trusted_Connection=True;");
    }
}

public class MasterType
{
    public string Id { get; set; }
    public string Name { get; set; }
}

Таблица рассчитана по вашему запросу:

design of table

данные, основанные на вашем вопросе:

enter image description here

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