Entity Framework Core - унаследованные типы объектов и имена таблиц Dynami c - PullRequest
0 голосов
/ 24 февраля 2020

У меня есть список таблиц, которые разделены. Есть много этих таблиц, но с одинаковой структурой. Поймите, что ядру EF требуются разные типы для них, но в конечном итоге я хотел бы использовать обобщенный c приведение к данным, чтобы упростить работу с данными. Работа с Oracle, но думаю, что вопросы будут применяться в общем.

Вот ошибка. В основном я хочу привести DbSet из T к DbSet из S, где S является родительским классом T.

System.InvalidCastException: «Невозможно привести объект типа» Microsoft.EntityFrameworkCore.Internal.InternalDbSet 1[EfCoreBidTest.BidPhaseLh2]' to type 'Microsoft.EntityFrameworkCore.DbSet 1 [EfCoreBidTest.BidPhase] '.'

Имейте в виду, я буду работать с несколькими унаследованными типами одновременно на одной и той же базе.

Вот пример базового класса:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;

namespace EfCoreBidTest
{
    public class BidPhase
    {
        [Column("YR")]
        public int Yr { get; set; }

        [Column("QTR")]
        public string Qtr { get; set; }

        [Column("AMB_CODE")]
        public string AmbCode { get; set; }

        [Column("SECT")]
        public string Sect { get; set; }

        [Column("PHASE_ITEM")]
        public int PhaseItem { get; set; }

        [Column("PHASE")]
        public string Phase { get; set; }

        [Column("PHASE_DATE")]
        public DateTime? PhaseDate { get; set; }
    }
}

и унаследованный класс (их будет много)

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Text;

namespace EfCoreBidTest
{
    [Table("BID_LH2_MASTSTAT_PHASE")]
    public class BidPhaseLh2 : BidPhase
    {
    }
}

Попытка создать метод generi c в DbContext для получения типа объекта фазы, вот когда Я получаю ошибку

    public DbSet<BidPhase> GetPhaseSet(string sys, string stage)
    {

        var t = typeof(BidDatabase);

        var setMethod = t.GetMethod("Set");
        var setMethodSpecific = setMethod.MakeGenericMethod(new Type[] { typeof(BidPhaseLh2) }); // TO DO - This will eventually get replaced with something to get the type based on the assembly name
        var dbSet = setMethodSpecific.Invoke(this, null);
        return (DbSet <BidPhase> ) dbSet;


        //sys = Char.ToUpper(sys[0]) + sys.Substring(1).ToLower();
        //return (IQueryable<BidPhase>) this.GetType().GetProperty("BidPhase" + sys + stage).GetValue(this);
    }

1 Ответ

1 голос
/ 24 февраля 2020

A DbSet<BidPhase> - это тип, совершенно отличный от DbSet<BidPhase2>, даже если генерические типы c наследуются друг от друга - DbSet<> не является ковариантным . Одним из способов решения этой проблемы было бы использование IQueryable<> вместо DbSet<>. Например:

public static IQueryable<BidPhase> GetPhaseSet(BidDatabase ctx)
{
    var t = typeof(BidDatabase);

    var setMethod = t.GetMethod("Set");
    var setMethodSpecific = setMethod.MakeGenericMethod(new Type[] { typeof(BidPhaseLh2) }); 
    var dbSet = setMethodSpecific.Invoke(ctx, null);
    return (IQueryable<BidPhase>)dbSet;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...