У меня есть следующие объекты:EF Linq для субъектов запроса, генерирующего UNION для TPC CTP5 кодовых первого лица
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
public class HappyUser : User
{
public bool IsHappy { get; set; }
}
Я настраиваемая сущность, используя таблицу Per Бетонного типа (TPC), чтобы создать таблицу пользователей и таблицу HappyUser. Я хочу, чтобы таблица HappyUser включала свойства класса User, и мне не нужны отношения между этими двумя таблицами.
Я настроить объекты следующим образом:
public class UserTest : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<HappyUser> HappyUsers { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<HappyUser>().Map(m =>
{
m.MapInheritedProperties();
m.ToTable("HappyUser");
});
}
}
Таблицы генерируются правильно, но когда я запрашиваю таблицы, EF генерирует UNION на пользователя и HappyUser таблице. Запрос выглядит следующим образом:
UserTest db = new UserTest();
var users = from u in db.Users
select u;
var happyUsers = from u in db.Users.OfType<HappyUser>()
select u;
SQL для пользователей генерирует UNION. Это не то, чего я ожидаю или хочу. Я хотел бы просто получить строки из таблицы Users.
SELECT
CASE WHEN ([UnionAll1].[C2] = 1) THEN '0X' ELSE '0X0X' END AS [C1],
[UnionAll1].[Id] AS [C2],
[UnionAll1].[Name] AS [C3],
CASE WHEN ([UnionAll1].[C2] = 1) THEN CAST(NULL AS bit) ELSE [UnionAll1].[C1] END AS [C4]
FROM (SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Name] AS [Name],
CAST(NULL AS bit) AS [C1],
cast(1 as bit) AS [C2]
FROM [dbo].[User] AS [Extent1]
UNION ALL
SELECT
[Extent2].[Id] AS [Id],
[Extent2].[Name] AS [Name],
[Extent2].[IsHappy] AS [IsHappy],
cast(0 as bit) AS [C1]
FROM [dbo].[HappyUser] AS [Extent2]) AS [UnionAll1]
SQL для HappyUsers работает должным образом.
SELECT
'0X0X' AS [C1],
[Extent1].[Id] AS [Id],
[Extent1].[Name] AS [Name],
[Extent1].[IsHappy] AS [IsHappy]
FROM [dbo].[HappyUser] AS [Extent1]
Любые идеи, что я делаю неправильно? Или это дефект в EF?
Я думаю, что в нижней строке, если я не могу изменить модель объекта или база данных, то EF не поддерживает этот сценарий. Итак, я изменю модель сущности, которая является меньшим количеством зла. Всем спасибо. –
Чтобы быть понятным, это L2E, который не поддерживает это, а не EF. Как я уже сказал, вы можете сделать это на ESQL. –