Связь EF Core One-to-One со свойствами Shadow в качестве ключей с использованием Fluent API - PullRequest
0 голосов
/ 05 февраля 2019

Я не могу разрешить отношения один-к-одному между двумя классами, используя Shadow Properties в качестве ключей.К сожалению, я не могу создать свойства реальных ключей в своих классах, потому что я использовал стороннюю библиотеку классов.

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 Core возвращает следующую ошибку, которая меня очень смущает:

System.InvalidOperationException : 'Связь между' ClassB.AnotherClass 'и' ClassA 'со свойствами внешнего ключа {' AnotherClassId ': int } не может быть нацелена на первичный ключ {'ClassAId ': int } , поскольку он не совместим .Настройте основной ключ или набор совместимых свойств внешнего ключа для этого отношения. '

1 Ответ

0 голосов
/ 05 февраля 2019

Оказывается, автоматическое связывание свойств с ключами, реализованное в EF Core посредством именования свойств, не работает в этом случае !

Они требуют от васпринудительно ввести имя ключа перед созданием соединения!

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");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...