添加 Entity Framework 数据注释到另一个项目的 Class

Add Entity Framework Data Annotation to Another Project's Class

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

所以我创建了以下项目:

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

RestApi 使用 Entity Framework(代码优先),所以通常您会用 [NotMapped][Key] 等东西装饰模型的属性。然而,我希望客户端解决方案对Entity Framework有任何依赖。 None。所以我无法使用特定于 EF 的属性来修饰模型的属性。

所以我的问题是,是否有某种方法可以从 RestApi 项目正确设置模型的 EF 特定属性,也许是在 Context 的构造函数或其他东西中?

这是使用独立于 table 类实体的自定义数据传输对象的一个​​很好的论据。尽管拥有几乎重复的 类 感觉有点矫枉过正——一个作为 DTO,一个作为 EF 实体——但还有另一个长期好处:两组 类 可以独立变化。假设您更改了 table table 结构,但客户端不需要知道此更改。更新 EF 实体,但不理会 DTO,尽管您可能必须更新从 EF 映射到 DTO 的方式。

说到映射:EmitMapper 可以极大地帮助两种类型的对象之间的传输。

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

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

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

这样的工具

您可以在 Models 项目中使用 POCO,让它们完全不知道 Entity Framework,然后在单独的项目或 RestApi 项目本身中进行映射。

您可以通过流畅的映射 API 来做到这一点,例如在 OnModelCreating 覆盖您在 EF 感知项目中创建的上下文:

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

等等