У меня есть список таблиц, которые разделены. Есть много этих таблиц, но с одинаковой структурой. Поймите, что ядру 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);
}