在EF数据库上下文中两次使用相同的c#模型

Xcheque

我们有一个应用程序,其中一组复杂的数据模型存储在数据存储区中-我们称数据的单个组为DataFiles。可以将这些DataFiles调用到编辑器中进行更改,然后将其保存回存储中。此过程与从硬盘加载Excel文件,进行编辑然后选择另存为不同。

我们当前的App设计将DataFile存储和DataFile编辑器分为两个数据库和两个数据库上下文。这样,我们可以对商店和编辑器使用相同的C#模型,并且可以对编辑的DataFile做一些非常简单的映射,将其映射回商店,反之亦然。在最简单的情况下:

  • 得到
  • A = B
  • 保存B

这消除了对属性进行1:1映射的需要。对于更复杂的数据结构,这也使得将A注入B相对容易

我们需要为商店和编辑器转移到单个数据库上下文。

问题是-在单个数据库上下文中,我们可以将一个C#数据模型绑定到数据库的两个单独的数据表吗?

这是我们正在尝试做的一个非常简单的例子。这不起作用,因为EF尝试将两个DbSet定义都映射到一个表(称为DataFile)

// C# model
namespace MyApp.Models
{
    public partial class DataFile
    {
        public int Id { get; set; }

        public int MyDataField { get; set; }
        public string MyOtherDataField { get; set; }

    }
}

// Database binding
public class AppDbContext : DbContext
{
    public AppDbContext() : base("name=AppDbContext"){}

    // Store Data File Access
    public virtual DbSet<DataFile> StoreDataFiles { get; set; }

    // Active Data File Access
    public virtual DbSet<DataFile> EditorDataFiles { get; set; }


    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

}
德鲁·乔丹

我认为这是一个解决方案,可以满足您的需求,唯一的警告是ID字段在两个表中必须是唯一的,并且您需要自己处理。除此之外,此技术源自此处的“每种具体类型的表”。

我们要做的是使用您的类型具有的属性创建一个抽象类,并从中继承它。这应该使两个类保持同步,并且可以通过来回转换来获得一个或另一个。这里重要的是DatabaseGeneratedAttribute设置为“ None”;使用此技术,由于两个表将具有相同的PK,EF无法说出它需要在表之间共享它们。

父类必须是抽象的。至少,这是我可以将其识别为DbSet而不为其创建表的唯一方法。

public abstract class DataFileParent
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int Id { get; set; }

        public int MyDataField { get; set; }
        public string MyOtherDataField { get; set; }
    }

public class DataFileEditor : DataFileParent
    {
    }

public class DataFileStore : DataFileParent
    {
    }

现在,我们可以创建我们的Context类,只有一个类DbSet可以在表之间共享。我们还将告诉上下文我们要根据实体的具体类型将实体映射到不同的表,这是通过OnModelCreating方法完成的

public class Context : DbContext
    {
        public DbSet<DataFileParent> DataFileParents { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<DataFileEditor>().Map(m =>
            {
                m.MapInheritedProperties();
                m.ToTable("DataFileEditor");
            });

            modelBuilder.Entity<DataFileStore>().Map(m =>
            {
                m.MapInheritedProperties();
                m.ToTable("DataFileStore");
            });
        }
    }

就是这样!现在,当您想要创建DataFileStore或时,DataFileEditor您可以这样做,并添加以下内容:(假设Store是type的变量DataFileStore

using (var db = new Context())
{
    db.DataFileParents.Add(Store);
    db.SaveChanges();
}

为此,我整理了一个小的控制台应用程序,并将其放在GitHub上

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在EF数据库上下文中两次使用相同的c#模型

来自分类Dev

如何在数据库上下文中运行没有C#返回值的存储过程?

来自分类Dev

数据库上下文中缺少GetTable <TEntity>()

来自分类Dev

C#以更好的方式使用数据库上下文和异常处理(DRY)

来自分类Dev

C#以更好的方式使用数据库上下文和异常处理(DRY)

来自分类Dev

Java类两次添加到Mylyn上下文中

来自分类Dev

为什么在使用C#的情况下每个上下文调用wglCreateContext两次,在使用C ++的情况下为何每个上下文调用一次?

来自分类Dev

使用EF 6.0在SQL Server Express 2012中使用相同上下文从数据库切换

来自分类Dev

首先使用现有DbConnection的C#实体框架6上下文对象数据库

来自分类Dev

使用不同的上下文访问数据库

来自分类Dev

Spring MVC在应用程序上下文中刷新数据库bean

来自分类Dev

从我的数据库上下文中基于ID删除用户

来自分类Dev

Spring MVC在应用程序上下文中刷新数据库Bean

来自分类Dev

事务如何在读取数据库的上下文中工作?

来自分类Dev

CoreStore 在上下文中创建对象而不保存到数据库

来自分类Dev

带有新数据库的EF6生成“自创建数据库以来,支持<Database>上下文的模型已更改。”

来自分类Dev

在相同的jboss-4.0.3中使用不同的域名但使用相同的上下文路径部署两次战争

来自分类Dev

C#等待的任务停留在相同的上下文中

来自分类Dev

如何在EF6代码优先中对数据库上下文使用通用类型

来自分类Dev

在Atmosphere的MeteorServlet中使用Spring DispatcherServlet时,Spring上下文会加载两次

来自分类Dev

数据表-在两个不同的上下文中使用'this'关键字

来自分类Dev

CastleWindsor,通用存储库和两个数据库上下文

来自分类Dev

使用ToList()和.AsQueryable()连接两个不同的数据库上下文有什么区别?

来自分类Dev

EF代码优先独立数据库多个上下文

来自分类Dev

自创建数据库以来,支持“ DataContext”上下文的模型已更改

来自分类Dev

在我的域模型中有数据库上下文是否可以

来自分类Dev

得到错误“自创建数据库以来,支持'DBContext'上下文的模型已更改。“

来自分类Dev

ASP.NET MVC4设置数据库上下文和模型

来自分类Dev

得到错误“自创建数据库以来,支持'DBContext'上下文的模型已更改。”

Related 相关文章

  1. 1

    在EF数据库上下文中两次使用相同的c#模型

  2. 2

    如何在数据库上下文中运行没有C#返回值的存储过程?

  3. 3

    数据库上下文中缺少GetTable <TEntity>()

  4. 4

    C#以更好的方式使用数据库上下文和异常处理(DRY)

  5. 5

    C#以更好的方式使用数据库上下文和异常处理(DRY)

  6. 6

    Java类两次添加到Mylyn上下文中

  7. 7

    为什么在使用C#的情况下每个上下文调用wglCreateContext两次,在使用C ++的情况下为何每个上下文调用一次?

  8. 8

    使用EF 6.0在SQL Server Express 2012中使用相同上下文从数据库切换

  9. 9

    首先使用现有DbConnection的C#实体框架6上下文对象数据库

  10. 10

    使用不同的上下文访问数据库

  11. 11

    Spring MVC在应用程序上下文中刷新数据库bean

  12. 12

    从我的数据库上下文中基于ID删除用户

  13. 13

    Spring MVC在应用程序上下文中刷新数据库Bean

  14. 14

    事务如何在读取数据库的上下文中工作?

  15. 15

    CoreStore 在上下文中创建对象而不保存到数据库

  16. 16

    带有新数据库的EF6生成“自创建数据库以来,支持<Database>上下文的模型已更改。”

  17. 17

    在相同的jboss-4.0.3中使用不同的域名但使用相同的上下文路径部署两次战争

  18. 18

    C#等待的任务停留在相同的上下文中

  19. 19

    如何在EF6代码优先中对数据库上下文使用通用类型

  20. 20

    在Atmosphere的MeteorServlet中使用Spring DispatcherServlet时,Spring上下文会加载两次

  21. 21

    数据表-在两个不同的上下文中使用'this'关键字

  22. 22

    CastleWindsor,通用存储库和两个数据库上下文

  23. 23

    使用ToList()和.AsQueryable()连接两个不同的数据库上下文有什么区别?

  24. 24

    EF代码优先独立数据库多个上下文

  25. 25

    自创建数据库以来,支持“ DataContext”上下文的模型已更改

  26. 26

    在我的域模型中有数据库上下文是否可以

  27. 27

    得到错误“自创建数据库以来,支持'DBContext'上下文的模型已更改。“

  28. 28

    ASP.NET MVC4设置数据库上下文和模型

  29. 29

    得到错误“自创建数据库以来,支持'DBContext'上下文的模型已更改。”

热门标签

归档