如何使用EF7 fluent API为单个POCO创建两个表?

时间:2015-12-13 12:26:18

标签: c# entity-framework ef-code-first entity-framework-core

我想为单个实体类型创建两个表。表是相似的,除了第二个可以错过一些外键(顺便说一下,在这个问题的上下文中它不是很重要)。

第一个表将以通用方式使用(选择查询,小插入查询等)。

第二个表是临时的,将用于批量插入操作(即首先我使用SqlBulkCopy将数据插入临时表,然后我使用MERGE查询将项目插入到第一个表中)。这种方法使我能够非常快速地插入数千条记录。

那么,强制EF7为同一个实体创建两个相同的表的最佳方法是什么?

我发现了类似的问题:Use same type against two identical tables in EF Code First 但似乎那个人(问一个问题的人)想要使用相同实体的多个DbSets。我的情况略有不同 - 我只想自动创建表格,仅此而已。

1 个答案:

答案 0 :(得分:2)

好吧,好像我可以自己回答这个问题。

所以,实际上我有一个丑陋的解决方案:使用简单继承我可以创建相同的实体,可以用于在同一个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; }
}