【问题标题】:Table Mapping problem表映射问题
【发布时间】:2011-07-28 20:52:24
【问题描述】:

我在当前项目中使用实体框架 4,从多个表中读取数据。 比较使用 ADO.net,它的 EF 非常简单,代码简单,可以做很多工作或我。

但是有一个问题……

e,g 存在并退出表调用表“MTable” 我只想从这个表中查询两列,但是这个表是与其他两个也在研究它的人共享的。他们可能会在此表上添加列或修改约束。 我唯一确定的一件事是,我要查询的两列不会删除或重命名。

我的应用程序现在正在运行,但有时它会中断,因为我从数据库模式生成代码,每次有人对“MTable”进行一些更新时,我都需要更新我的应用程序的映射。

有没有办法进行“代码拳”映射,允许我编写一个简单的模式来映射到“MTable”,并且只映射两列,这样我就可以不管其他人在“MTable”上做什么“???

谢谢

【问题讨论】:

    标签: c# mapping code-first entity-framework-4.1


    【解决方案1】:

    你的问题很不清楚。你是说你正在从你的模式生成代码,同时你问是否有办法首先用代码映射它。

    DbContext API != 代码优先方法。人们应该区分 Fluent / Annotations 映射和从代码生成数据库的代码优先方法。如果您从数据库生成代码,您显然是在使用数据库优先方法。

    数据库优先的解决方案:数据库视图,但它会使您的实体只读。恕我直言,即使表格发生变化,您也不应该有问题。如果您只需要两列并且没有人会更改这两列或创建新的必需列,那么您的映射实体应该仍然可以工作。如果有人更改了您的专栏,将没有有效的方法来避免破坏您的代码。

    您还可以使用高级 EDMX 功能,例如 QueryView(在映射描述中查看)和 DefiningQuery(在存储描述中自定义选择),但这些对于您的场景来说可能是多余的。

    代码优先的解决方案:关闭模型元数据验证和数据库初始化。它需要将初始化程序设置为null:

    // Use this code in the application start up
    Database.SetInitializer<MyContext>(null);
    

    并删除IncludeMetadataConvetion:

    public class MyContext : DbContext
    {
        ...
    
        protedte override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Conventions.Remove<IncludeMetadataConvention>();   
        }
    }
    

    在这两种方法中,您还可以使用自定义 SQL 查询或自定义 linq 投影。

    【讨论】:

      【解决方案2】:

      Entity Framework 对于仍在变化的数据库架构来说并不是真正的理想选择 - 毕竟您正在处理的所有抽象都是反映表架构的 entities,所以如果它正在发生变化,它将打破EF。然而,没有什么能阻止您仅使用商店查询来获取您的两列并将其映射到具有与您想要的列名称匹配的属性的自定义类:

      class  MyColumns
      {
        public string Column1 {get;set;}
        public string Column2 {get;set;}
      }
      
      ...
      
      using(var context = new FooEntities())
      {
         var results = context.ExecuteStoreQuery<MyColumns>("select Column1, Column2 from MTable");
      }
      

      【讨论】:

        【解决方案3】:

        我还没有尝试过,所以我不能说它可以与 EF 一起使用,但是您能否定义您想要的两列的直接选择视图以及主键(如果主键不是t 您的两列之一),然后针对视图构建您的 EF 模型。

        这将是我们如何将稳定的生产系统与过去对其他列的持续更改隔离开来。

        【讨论】:

        • 这听起来也不错......因为我听说有一种代码优先的方式来处理 EF4,我只是想知道.. 可能有一种方法只映射部分一张表的列..哈哈....
        【解决方案4】:

        当与大中型团队一起使用 EF 时,我们选择创建一个数据库项目,或者只是一个 sql 脚本来创建数据库/测试数据。使用源代码控制中的此文件,当团队成员修改数据库时,每个人都会获得最新的脚本/项目以及新的 edmx,一切都应该可以工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-29
          • 2015-08-24
          • 2019-01-22
          相关资源
          最近更新 更多