Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core 标识为0的实体框架核心种子数据_Asp.net Core_Ef Core 2.1 - Fatal编程技术网

Asp.net core 标识为0的实体框架核心种子数据

Asp.net core 标识为0的实体框架核心种子数据,asp.net-core,ef-core-2.1,Asp.net Core,Ef Core 2.1,我试图使用.HasData向模型中添加一些种子数据,以填充数据库。我在数据模型中使用ID 0映射到每个表上的未知项 在添加此项后尝试运行应用程序时,出现以下错误: 无法添加实体类型“DboTable”的种子实体,因为 没有为所需的属性“Id”提供值 我假设EFCore强制值为null,因为0的整数相当于null,但是当我尝试强制整数解析时,它仍然抛出相同的错误 在这一点上,我不确定如何处理这个问题,任何建议都将不胜感激 从DbContext.cs中剪切 ... entity.HasData(ne

我试图使用
.HasData
向模型中添加一些种子数据,以填充数据库。我在数据模型中使用ID 0映射到每个表上的未知项

在添加此项后尝试运行应用程序时,出现以下错误:

无法添加实体类型“DboTable”的种子实体,因为 没有为所需的属性“Id”提供值

我假设EFCore强制值为null,因为0的整数相当于null,但是当我尝试强制整数解析时,它仍然抛出相同的错误

在这一点上,我不确定如何处理这个问题,任何建议都将不胜感激

从DbContext.cs中剪切

...
entity.HasData(new DboTable()
{
    Id = 0,               // integer
    Label = "UNKNOWN",    // string
    ...
});
...

事实证明,EF Core 2.1不支持PK值为0

不幸的是,任何试图将值0用于PK的种子数据都必须使用自定义SQL运行迁移以插入其PK 0记录

请参阅:

在我反向工程代码并找到代码行后,我创建了一个小“黑客”来绕过0 PK值限制

这是我剪下的扩展代码:

using System;
using System.Linq;
using System.Collections.Generic;

using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Internal;
using Microsoft.EntityFrameworkCore.Metadata.Internal;

namespace EntityFrameworkCore.CustomMigration
{
    public static class CustomModelBuilder
    {
        public static bool IsSignedInteger(this Type type)
           => type == typeof(int)
              || type == typeof(long)
              || type == typeof(short)
              || type == typeof(sbyte);

        public static void Seed<T>(this ModelBuilder modelBuilder, IEnumerable<T> data) where T : class
        {
            var entnty = modelBuilder.Entity<T>();

            var pk = entnty.Metadata
                .GetProperties()
                .FirstOrDefault(property => 
                    property.RequiresValueGenerator() 
                    && property.IsPrimaryKey()
                    && property.ClrType.IsSignedInteger()
                    && property.ClrType.IsDefaultValue(0)
                );
            if (pk != null)
            {
                entnty.Property(pk.Name).ValueGeneratedNever();
                entnty.HasData(data);
                entnty.Property(pk.Name).UseSqlServerIdentityColumn();
            }
            else
            {
                entnty.HasData(data);
            }          
        }
    }
}
protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);

    builder.Seed(new List<Tenant> {
        new Tenant() {TenantID = 0 , Name = string.Empty},
        new Tenant() {TenantID = 1 , Name = "test"}
        //....
        );

    //....
}