2011-04-04 135 views
1

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

但有一个问题...

E,G有和退出表调用表“MTable” 我只想从这个表中查询两个列,但是这个表是与另外两名PPL份额谁也在努力。他们可能会在此表上添加列或修改约束。 我唯一确定的是,我想要查询的两列不会删除或重命名。

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

有没有办法做“代码拳头”的地图,让我写一个简单的模式映射到“MTable”,并只映射两列,这样我就可以不管什么其他脂肪酶做什么“ MTable“???

感谢

回答

1

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

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

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

您还可以使用像QueryView(定位描述中的视图)和DefiningQuery(定制选择存储描述中)的高级EDMX功能,但这些功能可能是针对您的方案矫枉过正的。

代码优先解决方案:关闭模型元数据验证和数据库初始化。它需要设置初始化到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投影。

1

实体框架是不是真的为这仍然是更改数据库架构的理想选择 - 所有的抽象后,您面对的是实体反映表模式,因此,如果这种情况正在改变它将打破英孚。但是没有什么可以阻止你只使用一个存储查询,让您的两列,并将其映射到具有性能匹配列的名称你想有一个自定义类:

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"); 
} 
+0

是的..我在想同样的事情..谢谢你的回答... – jojo 2011-04-04 01:46:54

1

我没有尝试过这一点,所以我不能说它可以和EF一起工作,但是你能定义一个你想要的两列的直接选择视图,也许主键(如果主键不是你的两列之一),然后构建你的EF模型反对的观点。

这就是我们将如何将稳定的生产系统从过去的改变中隔离出来的好时光。

+0

这听起来不错......因为我听说有一个代码优先的方式来工作EF4,我只是想知道..有可能是一种方法来只映射从一张桌子的一部分列..哈哈...... – jojo 2011-04-04 01:53:10

+0

这是一个好主意 – BrokenGlass 2011-04-04 01:55:45

0

当使用EF与大中型组合时,我们选择创建数据库项目,或者只是创建数据库/测试数据的SQL脚本。在源代码控制中使用此文件时,当团队成员修改数据库时,每个人都可以获得最新的脚本/项目以及新的edmx,并且所有人都应该能够工作。