表映射问题

时间:2011-04-04 01:19:48

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

我在当前项目中使用实体框架4,从几个表中读取数据。 比较使用ADO.net,EF非常简单,只需简单的代码即可完成大量的工作。

但是有一个问题......

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

我的应用程序现在正在运行,但是由于我从数据库模式生成代码,因此我不时会中断,每当有人对“MTable”进行更新时,我需要更新应用程序的映射。

有没有办法做“Code-fist”maping,允许我写一个简单的模式映射到“MTable”,并且只映射两列,这样我就可以不管其他ppl在“MTable”上做了什么“???

由于

4 个答案:

答案 0 :(得分:1)

实体框架实际上并不是仍然在变化的数据库模式的理想选择 - 在您处理的所有抽象之后都是反映表模式的实体,所以如果它正在改变它将会打破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");
}

答案 1 :(得分:1)

我没有试过这个,所以我不能说它可以用于EF,但是你可以定义你想要的两列的直接选择视图,也许是主键(如果主键不是'在你的两个列中的一个)然后针对视图构建你的EF模型。

这就是我们如何在过去的好时光中将稳定的生产系统与正在进行的改变隔离开来。

答案 2 :(得分:1)

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

DbContext API!=代码第一种方法。人们应该在Fluent / Annotations映射和从代码生成数据库的代码优先方法之间有所不同。如果从数据库生成代码,则显然是使用数据库第一种方法。

数据库优先解决方案:数据库视图,但它会使您的实体只读。即使表格发生变化,你也不会有问题。如果您只需要两列,并且没有人会更改这两列或创建新的必需列,则映射的enity仍然可以正常工作。如果有人更改了您的列,则无法有效地避免破坏您的代码。

您还可以使用高级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投影。

答案 3 :(得分:0)

在使用具有中型到大型组的EF时,我们选择创建数据库项目,或者只是创建一个sql脚本来创建数据库/测试数据。在源代码管理中使用此文件,当团队成员修改数据库时,每个人都会获得最新的脚本/项目以及新的edmx,所有这些都应该有效。