表映射问题

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

但是有一个问题……

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

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

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

谢谢

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

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

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

您还可以使用高级EDMXfunction,如QueryView(映射描述中的视图)和DefiningQuery(存储描述中的自定义选择),但这些function可能对您的方案有些过分。

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

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

并删除IncludeMetadataConvetion

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

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

entity framework实际上并不是仍然在变化的数据库模式的理想选择 – 在您处理的所有抽象之后都是反映表模式的实体 ,因此如果它正在改变,它将破坏EF。 但是,没有什么可以阻止您使用商店查询来获取两列并将其映射到具有与所需列的名称匹配的属性的自定义类:

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

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

这将是我们如何将稳定的生产系统从过去的变化中隔离到过去的其他专栏。

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