假设我有一组我想在多个项目中分享的课程。例如,我可以在REST服务中使用它们,也可以在使用该服务的客户端中使用它们。
所以我创建了以下项目:
RestApi和Client项目都依赖于Models项目。
RestApi正在使用实体框架(代码优先),因此通常您可以使用[NotMapped]
和[Key]
之类的内容来修饰模型的属性。但是,我没有希望客户端解决方案对Entity Framework有任何依赖性。没有。所以我无法装饰模型'具有EF特定属性的属性。
所以我的问题是,有没有办法正确设置模型'来自RestApi项目的EF特定属性,可能在Context的构造函数中或其他什么?
答案 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
这样的工具