EntityType не имеет определенного ключа - составной ключ, база данных сначала - PullRequest
0 голосов
/ 28 мая 2019

У меня есть веб-приложение MVC asp.net с 3 таблицами, PersonType, Curriculum и CurriculumPersonType, которое связывает две другие таблицы вместе с составным ключом. Я пытаюсь выполнить оператор LINQ для этой таблицы. Когда я запускаю свой код, я получаю "EntityType: EntitySet 'CurriculumPersonType' не имеет определенного ключа. Определите ключ для этого типа сущности". ошибка.

Я начал с этого в моей модели:

public class CurriculumPersonType
{
    [Key]
    public long CurriculumId { get; set; }

    [Key]
    public long PersonTypeId { get; set; }

    [ForeignKey("PersonTypeId")]
    public virtual PersonType PersonType { get; set; }

    [ForeignKey("CurriculumId")]
    public virtual Curriculum Curriculum { get; set; }
}

и попытался добавить другие аннотации, такие как:

    [Key]
    [Column("CurriculumId",Order =1)]
    public long CurriculumId { get; set; }

    [Key]
    [Column("PersonTypeId",Order =2)]
    public long PersonTypeId { get; set; }

и

    [Key]
    [ForeignKey("FK_CurriculumPersonType_CurriculumId")]
    public long CurriculumId { get; set; }

    [Key]
    [ForeignKey("FK_CurriculumPersonType_PersonTypeId")]
    public long PersonTypeId { get; set; }

Ничто из этого не похоже на работу. (Это Entity Framework 6.2.0)

Я просматривал похожие сообщения о переполнении стека и других сайтах, но, похоже, не решил мою проблему. Я думаю, что мне просто нужен еще один набор глаз.

Вот таблицы:

CREATE TABLE [dbo].[CurriculumPersonType]
(
[CurriculumId] BIGINT NOT NULL,
[PersonTypeId] BIGINT NOT NULL,
primary key ([CurriculumId], [PersonTypeId]),
CONSTRAINT [FK_CurriculumPersonType_PersonTypeId] FOREIGN KEY ([PersonTypeId]) REFERENCES [dbo].[PersonType] ([Id]),
CONSTRAINT [FK_CurriculumPersonType_CurriculumId] FOREIGN KEY ([CurriculumId]) REFERENCES [dbo].[Curriculum] ([Id])
)

CREATE TABLE [dbo].[PersonType]
(
[Id] BIGINT NOT NULL PRIMARY KEY IDENTITY, 
    [Name] VARCHAR(50) NOT NULL,
)

CREATE TABLE [dbo].[Curriculum]
(
[Id] BIGINT IDENTITY (1, 1) NOT NULL PRIMARY KEY,
[Name] varchar(500) NULL,
)

Другие 2 модели сущностей:

public class Curriculum 
{
    [Key]
    public long Id { get; set; }
    public string Name { get; set; }
}

public class PersonType 
{
    [Key]
    public long Id { get; set; }
    public string Name { get; set; }
}

И DBContext:

public class ApplicationDBContext : DbContext
{
    public ApplicationDBContext() : base("ApplicationDbContext")
    {

    }

    public DbSet<Curriculum> Curriculums { get; set; }
    public DbSet<CurriculumPersonType> CurriculumPersonTypes { get; set; }
    public DbSet<PersonType> PersonTypes { get; set; }
}

У моего приложения есть другие таблицы / модели и т. Д., Но всякий раз, когда я пытаюсь поразить любую из них, я получаю ошибку выше.

Просто поиграв, я добавил PK в таблицу и модель CurriculumPersonType, и все работает отлично. Конечно, я не хочу этого делать, потому что это позволит дублировать значения, но, похоже, зависло на модели, не имеющей свойства с именем "Id".

Новая таблица / модель:

CREATE TABLE [dbo].[CurriculumPersonType]
(
    [Id] BIGINT NOT NULL IDENTITY(1,1), 
    [CurriculumId] BIGINT NOT NULL,
    [PersonTypeId] BIGINT NOT NULL,
    CONSTRAINT [FK_CurriculumPersonType_PersonTypeId] FOREIGN KEY ([PersonTypeId]) REFERENCES [dbo].[PersonType] ([Id]),
    CONSTRAINT [FK_CurriculumPersonType_CurriculumId] FOREIGN KEY ([CurriculumId]) REFERENCES [dbo].[Curriculum] ([Id]), 
    CONSTRAINT [PK_CurriculumPersonType] PRIMARY KEY ([Id])
)

public class CurriculumPersonType
{
    [Key]
    public long Id { get; set; }

    //[Key]
    //[Column(Order = 1)]
    public long CurriculumId { get; set; }

    //[Key]
    //[Column(Order = 2)]
    public long PersonTypeId { get; set; }

    [ForeignKey("CurriculumId")]
    public virtual Curriculum Curriculum { get; set; }

    [ForeignKey("PersonTypeId")]
    public virtual PersonType PersonType { get; set; }
}

1 Ответ

0 голосов
/ 29 мая 2019

Ошибка «EntityType '{x}' не имеет определенного ключа. Определите ключ для этого EntityType.» указывает, что DBSet указывает на класс, отличный от указанного выше определения сущности. В DbContext, используя in DbSet<CurriculumPersonType>, щелкните правой кнопкой мыши CurriculumPersonType и «Перейти к определению». Я догадываюсь, что у вас есть другой класс с именем CurriculumPersonType, на который ссылается DbContext (например, автоматически сгенерированный класс). Если классы находятся в разных сборках, убедитесь, что все сборки собраны и обновлены, хотя ссылочные сборки должны автоматически перестраиваться при изменении.

Если у вас есть сущность с составным ключом, использующая просто [Key] без порядка столбцов, сообщение об исключении будет:

"Невозможно определить порядок составного первичного ключа для типа '{x}'. Используйте атрибут ColumnAttribute (см. http://go.microsoft.com/fwlink/?LinkId=386388) или метод HasKey (см. http://go.microsoft.com/fwlink/?LinkId=386387), чтобы указать порядок для составных первичных ключей). . "

Порядок столбцов можно назначить с помощью [Key, Column(Order=0)] Нет необходимости указывать имя столбца в атрибуте, если имя свойства совпадает. Можно использовать порядки 0,1 или 1,2, это просто порядок столбцов в ключе.

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