2012-03-19 65 views
1

我有一大堆实现业务逻辑的类。大多数都有一个.Load方法,它使用普通的旧ADO.net来读取我多年来手写的Sql Server的值。这一切都早于Linq2Sql和EF。具有现有类和现有表的实体框架4.1

现在我想更新我的类库来使用实体框架,但我想尽可能无痛地做到这一点。我已经了解到EF可以从我的类中的属性名称中推断出列名和键名,但是我的类有许多属性与列名称不匹配,而某些属性与数据库的列名称不匹配。我宁愿不必去.Ignore()每个这些属性(并记住总是.Ignore()任何未来的属性)和.HasColumnName()所有的差异。

对现有表和现有类使用EF最简单的方法是什么,所以我可以做最小限度的映射,并仍然使用DbContext来实现.Find()实体和SaveChanges()以及所有其他强大类型的强大类型的事物EF支持而无需手动通过我的所有商业课程并注释哪些属性包含在内?

例如,我希望能够db.Customers.Find(123)并让它创建一个Customer实例,从CustomerID = 123的客户中选择*,并将存在的列映射到尽可能保持最佳状态的属性,并给我一个随时可以使用的Customer实例,然后我可以根据需要注释任何差异。这是可能的还是我要求过多的EF?

是否有更聪明的DbContext可以尽最大努力映射属性,以便利用我现有的所有业务类?也许我应该考虑一些其他的ORM?

+0

其他ORM不会帮你。如果你有数据库和类,你必须总是努力为每个类创建正确的映射。 – 2012-03-19 20:55:40

回答

0

EF4“代码优先”使您可以选择覆盖其默认的数据库持久性映射规则,并配置备选方法将您的类映射到数据库。

有几种方法来启用此功能。一个最简单的方法之一就是覆盖上的DbContext基类中定义的“OnModelCreating”的方法:

​​
+0

我试过这个,但我需要调用。忽略每个类中与数据库中的列不对应的每个属性? – powlette 2012-03-20 01:41:45

+0

是的。映射必须在EF的某处指定,以便了解要使用哪些属性/列。我认为最简洁的方式来指定这是在单独的映射文件,而不是污染你的poco类的属性。 – Marcus 2012-03-20 09:29:11

1

试试这个:

public class YourContext : DbContext 
{ 
    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     // Mapping 
    } 
} 

您可以通过主键通过查找还是搜索您的实体: 从数据库创建数据模型(.edmx)。 编辑模型,添加您要添加​​到数据库的类的属性和过程。 最后,从您的模型(.Edmx)更新您的数据库选择只有表和过程存在您有更改。 你可以看一下这些教程 http://msdn.microsoft.com/en-us/data/gg685494 http://msdn.microsoft.com/en-us/data/gg685489

+0

http://www.hanselman.com/blog/EntityFrameworkCodeFirstMigrationsAlphaNuGetPackageOfTheWeek10.aspx – user1235486 2012-03-19 21:41:41