Imports System.ComponentModel.DataAnnotations
Public Class Test1Item
<Key()>
<DatabaseGenerated(DatabaseGeneratedOption.Identity)>
Public Property id As Integer
Public Property data1 As String
End Class
Public Class Test2Item : Inherits Test1Item
Public Property data2 As String
End Class
Public Class Test3Item : Inherits Test2Item
Public Property data3 As String
End Class
Public Class Test4Item : Inherits Test2Item
Public Property data4 As String
End Class
Public Class Test5Item : Inherits Test2Item
Public Property data5 As String
End Class
上記のようにエンティティクラスを継承していき、それぞれで一つずつプロパティを増やしていきます。
Imports System.Data.Entity
Public Class TestContext : Inherits DbContext
Public Property Test1Items As DbSet(Of Test1Item)
End Class
上記のようにコンテキストの設定を行い、最基底のTest1Itemを取得してみます。
CREATE TABLE [dbo].[Test1Item] (
[id] int NOT NULL IDENTITY(1,1) ,
[data1] nvarchar(200) COLLATE Japanese_CI_AS NOT NULL ,
)
DBは上記のように、最基底のアイテムのみ保持しています。
これで発行されるSQLは下記の通り。
SELECT
[Extent1].[Discriminator] AS [Discriminator],
[Extent1].[id] AS [id],
[Extent1].[data1] AS [data1],
[Extent1].[data2] AS [data2],
[Extent1].[data3] AS [data3],
[Extent1].[data4] AS [data4],
[Extent1].[data5] AS [data5]
FROM [dbo].[Test1Item] AS [Extent1]
WHERE [Extent1].[Discriminator] IN (‘Test2Item’,’Test3Item’,’Test4Item’,’Test5Item’,’Test1Item’)
継承先のすべてのアイテム定義が含まれてしまうんですね・・・。
各テーブル共通項目を基底クラスに定義して、各エンティティクラスを継承して作成したかったのですが、
2重3重で継承する際は要注意ですね。