将实体框架数据注释添加到另一个项目的类

时间:2015-02-11 21:44:32

标签: c# .net entity-framework entity-framework-6

假设我有一组我想在多个项目中分享的课程。例如,我可以在REST服务中使用它们,也可以在使用该服务的客户端中使用它们。

所以我创建了以下项目:

  • MyOrders.Models
  • MyOrders.RestApi
  • MyOrders.Client

RestApi和Client项目都依赖于Models项目。

RestApi正在使用实体框架(代码优先),因此通常您可以使用[NotMapped][Key]之类的内容来修饰模型的属性。但是,我没有希望客户端解决方案对Entity Framework有任何依赖性。没有。所以我无法装饰模型'具有EF特定属性的属性。

所以我的问题是,有没有办法正确设置模型'来自RestApi项目的EF特定属性,可能在Context的构造函数中或其他什么?

3 个答案:

答案 0 :(得分:2)

您可以在Models项目中拥有POCO,让他们完全不了解实体框架,并在单独的项目或RestApi项目本身中进行映射。

您可以通过流畅的映射API执行此操作,例如在您在EF感知项目中创建的上下文的OnModelCreating覆盖中:

modelBuilder.Entity<Order>().HasKey(o => o.OrderID);
modelBuilder.Entity<Order>().Ignore(o => o.OrderTotal);

答案 1 :(得分:1)

这是使用独立于表格式实体的自定义数据传输对象的一个​​很好的论据。虽然有几乎重复的类(一个是DTO,另一个是EF实体)可能感觉有些过分,但还有另一个长期的好处:两组类可以独立变化。我们假设您更改了表格表结构,但客户并不需要知道此更改。更新EF实体,但您可以单独保留DTO,但您可能需要更新从EF到DTO的映射方式。

说到映射:EmitMapper可以很好地帮助在两种类型的对象之间进行转换。

答案 2 :(得分:1)

您需要使用Data Transfer Objects将数据访问模型与应用程序的其余部分分开。

这将带来很多好处。首先,它将查看您是否复制了模型的所有代码。但是当你的应用程序增长时,你会发现需要视图中的数据,这些数据的格式不同于数据库的存储方式。验证属性可以按照您需要的方式以非常具体的方式添加。

它们之间的映射可以通过各种方式完成。手动或使用像AutoMapper

这样的工具