我想为单个实体类型创建两个表。表是相似的,除了第二个可以遗漏一些外键(顺便说一句,在该问题的上下文中不是很重要)。
第一个表将以常见方式使用(选择查询,少量插入查询等)。
第二个表是临时表,将用于批量插入操作(即,首先,我使用SqlBulkCopy以便将数据插入到临时表中,然后,我使用MERGE查询将项向上插入到第一个表中)。这种方法使我可以非常快速地增加数千条记录。
那么,强制EF7为同一实体创建两个相同表的最佳方法是什么?
我发现了一个类似的问题:首先在EF Code中对两个相同的表使用相同的类型,但是似乎那个家伙(一个问这个问题的人)想要具有相同实体的多个DbSet。我的情况没什么不同-我只想自动化表创建,仅此而已。
好的,看来我可以自己回答这个问题了。
因此,实际上我有一个丑陋的解决方案:使用简单继承,我可以创建相同的实体,该实体可用于在同一DbContext中创建另一个DbSet。
另外,为了避免参与EF继承策略,我需要将基本类型保持未映射状态(即,在数据库架构中不需要任何与继承相关的更改)。这项要求迫使我创建基类(将不进行映射)和两个继承者(一个用于主表DbSet,另一个用于临时表DbSet)。
这种方法使我避免了相同类型的问题,更重要的是,使我能够保持表模式完全相同而没有任何问题。
例子:
/// <summary>
/// Base entity, not used by EF at all - intended to define properties only.
/// </summary>
public class MyEntityBase
{
public int Id { get; set; }
public string Name { get; set; }
}
/// <summary>
/// That entity used to create primary table and used by app logic.
/// </summary>
public class MyEntity : MyEntityBase
{
}
/// <summary>
/// That entity used to create temp table only.
/// </summary>
public class MyTempEntity : MyEntityBase
{
}
/// <summary>
/// Here is our DB context with two DbSets...
/// </summary>
public class MyDbContext : DbContext
{
/// <summary>
/// That DbSet should be used by app logic.
/// </summary>
public DbSet<MyEntity> MyEntities { get; set; }
/// <summary>
/// That DbSet will force EF to create temp table.
/// App logic shouldn't interact with it in common way
/// (only SqlBulkCopy and some hand-written queries)
/// so it is not public.
/// </summary>
protected DbSet<MyTempEntity> MyTempEntities { get; set; }
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句