Тип сущности 'xxx' требует первичного ключа, но я уже определил его? - PullRequest
0 голосов
/ 06 мая 2019

Моя сущность является производной от класса Entity, поэтому по умолчанию она должна иметь идентификатор типа int, но по какой-то причине EntityFramework его не распознает. Я даже пытался вручную сделать мой первичный ключ (закомментированный), но он все равно не будет работать.

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;
using Abp.Domain.Entities;
using Abp.Domain.Entities.Auditing;
using Abp.Timing;

namespace Test.Models
{

    [Table("AppTasks")]
    public class Task : Entity, IHasCreationTime
    {
        //[Key]
        //public int Id { get; set; }

        public const int MaxTitleLength = 256;
        public const int MaxDescriptionLength = 64 * 1024;



        [Required]
        [StringLength(MaxTitleLength)]
        public string Title { get; set; }


        [StringLength(MaxDescriptionLength)]
        public string Description { get; set; }

        public TaskState State { get; set; }

        public DateTime CreationTime { get; set; }

        public Task()
        {
            CreationTime = Clock.Now;
            State = TaskState.Open;
        }

        public Task(string title, string description = null) : this()
        {
            Title = title;
            Description = description;
        }
    }

    public enum TaskState : byte
    {
        Open = 0,
        Completed = 1
    }
}

1 Ответ

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

Попробуйте использовать бетон IEntityTypeConfiguration<T>:

public class TaskConfiguration : IEntityTypeConfiguration<Task>
{
    public void Configure(EntityTypeBuilder<Task> builder)
    {
        builder.HasKey(tsk => tsk.Id);
        //builder.HasMany(...) relationships et al.
    }
}

И в вашем DbContext определении (или как вы его назвали):

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    builder.ApplyConfiguration(new TaskConfiguration());
}

Это определенно должно настроить EFCore таким образом, что Id будет первичным ключом для этого объекта. В качестве дополнительного преимущества вы получаете немного больше гибкости и более чистый код.

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