Entity Framework - Wiele Entity do jednej tabeli

0

Witam.
Chciałbym do jednej tabeli w bazie danych wrzucić 2 różne entity. Czy jest taka możliwość? Jeśli tak to w jaki sposób to można zrealizować?

Moja próba:

using System;
using System.Collections.Generic;
using System.Linq;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;

namespace Test
{
    public class Person
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string Surname { get; set; }
        public DateTime DateBirth { get; set; }
    }

    public class Employee
    {
        public int Id { get; set; }
        public string FirstName { get; set; }
        public string Surname { get; set; }
    }


    public class DataContext : DbContext
    {
        public virtual DbSet<Person> Person { get; set; }
        public virtual DbSet<Employee> Employee { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            => optionsBuilder
                .UseMySql(@"Server=localhost;database=ef;uid=root;pwd=qwerty;port=3307");

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Person>(entity =>
            {
                entity.ToTable("Person");
                entity.HasKey(x => x.Id);
                entity.Property(x => x.Surname).HasColumnName("Surname");
                entity.Property(x => x.FirstName).HasColumnName("FirstName");
                entity.Property(x => x.DateBirth).HasColumnName("DateBirth");
            });

            modelBuilder.Entity<Employee>(entity =>
            {
                entity.ToTable("Person");
                entity.HasKey(x => x.Id);
                entity.Property(x => x.Surname).HasColumnName("Surname");
                entity.Property(x => x.FirstName).HasColumnName("FirstName");
            });
        }
    }

    public class Program
    {
        public static void Main()
        {
            using (var context = new DataContext())
            {
                var person = new Person
                {
                    FirstName = "Jan",
                    Surname = "Kowalski",
                    DateBirth = DateTime.Now
                };
                context.Add(person);
                context.SaveChanges();

                var employe = new Employee();
                employe.FirstName = "Piotr";
                employe.Surname = "Nowak";
                context.Add(employe);
                
                context.SaveChanges();
            }

        }
    }
}


Unhandled Exception: System.InvalidOperationException: Cannot use table 'Person' for entity type 'Person' since it is being used for entity type 'Employee' and there is no relationship between the primary key {'Id'} and the primary key {'Id'}.
0

W ogóle nie rozumiem po co chcesz.to zrobić.

2
ProgramistaBezWiedzy napisał(a):

Witam.
Chciałbym do jednej tabeli w bazie danych wrzucić 2 różne entity. Czy jest taka możliwość? Jeśli tak to w jaki sposób to można zrealizować?

A czemu Cię w ogóle zaczynasz rozwiązywanie problemu od zagłębiania się w szczegóły działania ORMa? Bierzesz udział w jakimś konkursie na jak najmniejszą liczbę tabel w bazie? Co do tego ma walidacja?

Zabierasz się do problemu z odwrotnej strony. Jeśli Person i Employee są od siebie niezależnymi encjami, to powinno być tak jak teraz. Jeśli zaś jedno jest typem drugiego, to jedna klasa powinna dziedziczyć z drugiej. ORM może zmapować hierarchię dziedziczenia na kilka sposobów w tym także tworząc jedną tabelę dla wszystkich klas z hierarchii - ale to też ma swoje wady (kolumny, które różnią się między typami muszą być nullowalne i oczywiście będą miały puste wartości w przypadku rekordów należących do klas nie posiadających danych pól).

0

Dopowiem ważne zdanie. Model relacyjny i model obiektowy to dwie zupełnie różne sprawy. Nie da się tego w 100% połączyć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1