我想在我的应用程序中拥有每个具体类型的sherstonal:
public class Row {
public int Id {get;set;}
public string Name {get;set;}
}
public class ExtendedRow : Row {
public int Weight {get;set;}
}
每个类都需要映射到自己的视图,ExtendedRow
视图具有Row
视图的所有列。
我的配置是:
modelBuilder.Entity<Row>().Map(m => {
m.MapInheritedProperties();
m.ToTable("Row");
});
modelBuilder.Entity<ExtendedRow >().Map(m => {
m.MapInheritedProperties();
m.ToTable("ExtendedRow");
});
查询ExtendedRow
就很好。但是,查询Row
生成以下SQL:
SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Name] AS [Name]
FROM [dbo].[Row] AS [Extent1]
UNION ALL
SELECT
[Extent2].[Id] AS [Id],
[Extent2].[Name] AS [Name]
FROM [dbo].[ExtendedRow] AS [Extent2]
为什么EF添加UNION ALL
操作员?我该如何修复?
有关此主题的堆栈溢出有几个问题。
EF以您看到的方式工作,如果您要求基础,您将收到实现基础的所有对象(即基础和派生对象)。如果您使用TPC,则会看到联合,如果使用TPH,则会看到EF省略了鉴别器字段上的WHERE子句(即TPC或TPH无关紧要,结果始终是相同的)。 GetType
不是EF典型函数,因此您不能使用它,但是我已经阅读了可以使用的EF 6.x(在您的情况下!(m is ExtendedRow)
)。实际上我不知道它是否有效。
在这里找到了对我有用的建议:
public abstract class RowBase {
public int Id {get;set;}
public string Name {get;set;}
}
public class Row : RowBase {
}
public class ExtendedRow : RowBase {
public int Weight {get;set;}
}
关键是要拥有一个abstract
类,以便EF如果使用MapInheritedProperties()
,请勿尝试使用继承逻辑。