InvalidOperationException:实体类型“ Array”需要定义主键

时间:2019-08-27 14:47:25

标签: asp.net

我正在使用.Net制作Web API,它正在从Web表单接收自定义JSON对象以序列化到模型。我目前在显示API响应时遇到问题。我首先将数据存储在内存数据库中只是为了使其正常工作。

尽管我的模型上定义了一个键,但我不确定为什么它要我提供主键。

我的下一步是添加多部分形式的数据,但这是蠕虫病毒本身的罐头。 错误发生在_context.ProjectItems.ToListAsync();行。 我已经为模型添加了ID。

    [Required]
    [Key]
    public new long Id { get; set; }

    [HttpGet("{id}")]
    public async Task<ActionResult<ProjectItem>> GetProjectItem(long id)
    {
        var projectItem = await _context.ProjectItems.FindAsync(id);

    if (projectItem == null)
    {
        return NotFound();
    }



    return projectItem;



   }
  [HttpGet]
    public async Task<ActionResult<IEnumerable<ProjectItem>>> 
GetProjectItems()
    {
        return await _context.ProjectItems.ToListAsync();
    }

我的模型:ProjectItem.cs

    using System.ComponentModel.DataAnnotations;

    namespace RupAPI.Controllers
    {
        public class ProjectItem : Project
        {
            [Required]
            [Key]
            public new long Id { get; set; }

            public string ProjName { get; set; }
            public DateTime DateSub { get; set; }
            public DateTime DueDate { get; set; }
            public DateTime ArrivalDate { get; set; }
            public string Desc { get; set; }
            public Array Sku { get; set; }
            public Array SkuDesc { get; set; }
            public Array Item { get; set; }
            public Array ItemDesc { get; set; }
            public Array FileName { get; set; }
            public new byte[] File { get; set; }
        }
    }
  

处理请求时发生未处理的异常。 InvalidOperationException:实体类型'Array'需要定义一个主键。           Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.ValidateNonNullPrimaryKeys(IModel模型)           堆栈查询Cookie标头           InvalidOperationException:实体类型'Array'需要定义一个主键。           +                       返回等待_context.ProjectItems.ToListAsync();           lambda_method(Closure,object)

1 个答案:

答案 0 :(得分:0)

重新考虑将Array用作属性的类型,这会导致此问题。

如果这些属性确实不只是string,请创建其他模型来表示这些属性,然后使用relationships将它们存储在数据库中。

如果属性是字符串列表,则提出了here的几种解决方案。如果可能的话,我会寻求Sasan的解决方案,这是针对您的情况,将Array替换为string[]并添加

modelBuilder.Entity<ProjectItem>()
    .Property(e => e.Sku)
    .HasConversion(
        v => string.Join(',', v),
        v => v.Split(',', StringSplitOptions.RemoveEmptyEntries));
// TODO: also to that for the other properties

访问数据库上下文的OnModelCreating