【问题标题】:Entity Framework 4.1 with existing classes AND existing tables具有现有类和现有表的实体框架 4.1
【发布时间】:2012-03-20 05:10:53
【问题描述】:

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

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

将 EF 与现有表和现有类一起使用的最简单方法是什么,这样我就可以进行最少的映射,并且仍然使用 DbContext 来 .Find() 实体和 SaveChanges() 以及 EF 支持的所有其他不错的强类型事物手动浏览我的所有业务类并注释要包含的属性?

例如,我希望能够 db.Customers.Find(123) 并让它创建一个 Customer 实例,从 CustomerID=123 的客户中选择 *,并将确实存在的列映射到尽可能最好地存在的属性,并为我提供一个准备好使用的客户实例,然后我可以根据需要注释任何差异。这是可能的还是我对 EF 的要求太高了?

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

【问题讨论】:

  • 其他 ORM 帮不了你。如果您同时拥有数据库和类,则必须始终努力为每个类创建正确的映射。

标签: entity-framework-4.1


【解决方案1】:

试试这个: 从您的数据库创建一个数据模型 (.edmx)。 编辑模型,添加要添加到数据库的类的属性和过程。 最后,从您的模型 (.Edmx) 更新您的数据库 你可以看看那些教程 http://msdn.microsoft.com/en-us/data/gg685494 http://msdn.microsoft.com/en-us/data/gg685489

【讨论】:

【解决方案2】:

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

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

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

您仍然可以使用 Find 按主键搜索您的实体:

var unicorn = context.Unicorns.Find(3);

【讨论】:

  • 我试过这个,但我需要在每个类中的每个属性上调用 .Ignore,这些属性与数据库中的列不对应,对吧?
  • 是的。必须在某处指定映射,以便 EF 了解要使用的属性/列。我认为指定这一点的最简洁方法是在单独的映射文件中,而不是通过使用属性污染你的 poco 类。
猜你喜欢
  • 1970-01-01
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多