Я пытался создать реляционную модель, используя 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?Если я, то что происходит?