Предполагая, что код сначала EF 4, есть несколько (очень?) Надуманный способ, который требует использования представлений для создания столбца виртуального дискриминатора, такого же, как ListId.
Вы должны быть в состоянии добавитьпредставление в БД и «вместо» запускает это представление для имитации нового столбца.Во всем этом вам нужно обойти некоторые проблемы, которые EF имеет с этим подходом.
CREATE view [dbo].[vListItem] as
select Id, ListId,[Text]
,cast(ListId as varchar(10)) as Discriminator
from xListItem;
GO
Note: need the cast to varchar <= int causes errors on EF (MaxLength facet)
Пример триггера для вставки:
CREATE TRIGGER trg_vListItem_Insert
ON [vListItem]
INSTEAD OF INSERT
AS
Begin
-- set nocount on
Insert into xListItem (ListId,[Text])
Select i.ListId, i.[Text]
from Inserted i
-- Need this so Ef knows a row has been inserted
select Id from xListItem where @@ROWCOUNT > 0 and Id = scope_identity()
End
Note: Delete and Update would be similar.
Тогда вы можете иметь в своей модели:
public class vListItem
{
[Key]
public int Id { get; set; }
public string Text { get; set; }
[ForeignKey("ListId")]
public xList aList { get; set; }
public int ListId { get; set; }
}
public class vPerson : vListItem
{
}
public class vThing : vListItem
{
}
На вашем DbContext вы можете иметь:
public DbSet<vListItem> vitems { get; set; }
public DbSet<vPerson> vpersons { get; set; }
public DbSet<vThing> vthings { get; set; }
И, OnModelСоздавая вам определение:
modelBuilder.Entity<vListItem>()
.Map<vPerson>(m => m.Requires("Discriminator").HasValue("1"))
.Map<vThing>(m => m.Requires("Discriminator").HasValue("2"))
;
Вот так.Некоторые тесты:
[TestMethod]
public void TestMethodPersonInsert()
{
Entities db = new Entities();
xList xl = db.lists.SingleOrDefault(x => x.Id == 1);
vPerson vp = new vPerson();
vp.Text = "p4";
vp.aList = xl;
db.vpersons.Add(vp);
db.SaveChanges();
}
[TestMethod]
public void TestMethodThingInsert()
{
Entities db = new Entities();
xList xl = db.lists.SingleOrDefault(x => x.Id == 2);
vThing vt = new vThing();
vt.Text = "t0";
vt.aList = xl;
db.vthings.Add(vt);
db.SaveChanges();
}