EF Core 2.1 говорит, что несколько столбцов были добавлены в первичный ключ, но они не имеют - PullRequest
0 голосов
/ 24 октября 2018

Я пытался создать реляционную модель, используя EF Core 2.1, но при добавлении миграций я получал ошибку о привязке нескольких столбцов к первичному ключу.Похоже, что это не так, и я не уверен, почему он так думает.

Мне удалось воспроизвести очень простой проект, приведенный ниже, и это была ошибка.

Ключи {'ParentId'} в 'OwnedEntity' и {'Id'} в 'Entity' оба сопоставлены с 'Entities.PK_Entities', но с разными столбцами ({'ParentId'} и {'Id'}).

Эта ошибка происходит от здесь

Удаление атрибута ColumnAttribute позволяет Add-Migration продолжить / успешно, но я действительно не хотел иметь тип Ownedдобавляется к каждому столбцу.

using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;

namespace OwnedTypeTest
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();
    }
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddDbContext<TestDBContext>(o=>o.UseSqlServer("test"));
        }

        public void Configure(IApplicationBuilder app, IHostingEnvironment env) { }
    }
    public class TestDBContext : DbContext
    {
        public TestDBContext(DbContextOptions options) : base(options) { }
        public DbSet<Entity> Entities { get; set; }
    }
    public class Entity
    {
        public System.Guid Id { get; set; }
        public OwnedEntity Owned { get; set; }
    }
    [Owned]
    public class OwnedEntity
    {
        [Column(nameof(ParentId))]
        public System.Guid ParentId { get; set; }
        [Column(nameof(Parent))]
        public Entity Parent { get; set; }
    }
}

Если я переопределяю OnModelCreating, как показано ниже, я получаю закомментированные результаты

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);
    Debugger.Launch();
    var et = modelBuilder.Model.GetEntityTypes(typeof(Entity)).First();
    var keys = et.GetKeys();
    var keyCount = keys.Count(); // 1
    var key = keys.First().ToString(); // Key: Entity.Id PK
    var properties = keys.First().Properties;
    var propertyCount = properties.Count(); // 1
    var property = properties.First().ToString(); // Property: Entity.Id (Guid) Required PK AfterSave:Throw ValueGenerated.OnAdd 0 0 0 -1 0
}

Для полноты вот мой csproj

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Folder Include="wwwroot\" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="BuildBundlerMinifier" Version="2.6.375" />
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.1.5" />
    <PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.1.3" />
    <PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="2.1.3" />
    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="2.1.4" />
    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.1" />
    <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="2.1.1" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="2.1.4" />
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.1.4" />

  </ItemGroup>

</Project>

Isэто ошибка или я пропускаю неявное поведение EF?Если я, то что происходит?

...