EF核心1对一个使用流利API与阴影属性作为密钥关系

问题描述 投票:1回答:1

我无法解析使用阴影属性作为一个键两个类之间的一对一的关系。不幸的是我不能创建真正的关键特性到我的班,由于我使用的第三方类库。

using Microsoft.EntityFrameworkCore;
using System;

namespace EFCoreTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Create database");
            using (var context = new ClassDbContext())
            {
                if (!context.Database.EnsureDeleted())
                {
                    Console.WriteLine(" => Can't delete database");
                }
                if (context.Database.EnsureCreated())
                {
                    context.SaveChanges();
                    Console.WriteLine(" => Done");
                }
                else
                {
                    Console.WriteLine(" => Can't create database");
                }
            }
            Console.WriteLine("End");
        }
    }
    public class ClassDbContext : DbContext
    {
        public virtual DbSet<ClassA> ClassA { get; set; }
        public virtual DbSet<ClassB> ClassB { get; set; }
        public ClassDbContext()
        {
        }
        public ClassDbContext(DbContextOptions<ClassDbContext> options) : base(options)
        {
        }
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            if (!optionsBuilder.IsConfigured)
            {
                optionsBuilder.UseSqlServer("Server=XXX.XXX.XXX.XXX;Database=XXXXX;User ID=XXXXX;Password=XXXXX");
            }
        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<ClassA>().Property<int>("ClassAId");
            modelBuilder.Entity<ClassB>().Property<int>("ClassBId");
            modelBuilder.Entity<ClassB>().Property<int>("AnotherClassId");
            modelBuilder.Entity<ClassB>().HasOne(p => p.AnotherClass).WithMany().HasForeignKey("AnotherClassId");
        }
    }
    public class ClassA
    {
        public string PropertyA { get; set; }
    }
    public class ClassB
    {
        public string PropertyB { get; set; }
        public ClassA AnotherClass { get; set; }
    }
}

EF核心返回与下面的错误,这是非常让我感到困惑:

System.InvalidOperationException:ClassB.AnotherClass‘到‘ClassA的’与外键的属性{“AnotherClassId”从关系’”:INT}不能指定主键{‘ClassAId’:INT},因为它是不兼容的。配置主键或一组这种关系兼容外键的属性“。

c# entity-framework-core
1个回答
1
投票

事实证明,自动属性键的结合,通过属性的命名在EF核心实现的,并不在这种情况下工作!

他们要求你创建一个连接之前强制键名!

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<ClassA>().Property<int>("ClassAId");
    modelBuilder.Entity<ClassA>().HasKey("ClassAId"); // <=== This is a SOLUTION
    modelBuilder.Entity<ClassB>().Property<int>("ClassBId");
    modelBuilder.Entity<ClassB>().Property<int>("AnotherClassId");
    modelBuilder.Entity<ClassB>().HasOne(p => p.AnotherClass).WithMany().HasForeignKey("AnotherClassId");
}
© www.soinside.com 2019 - 2024. All rights reserved.