C# 将实体框架数据注释添加到另一个项目&x27;s级
假设我有一组我想在多个项目中共享的类。例如,我可以在REST服务中使用它们,也可以在使用该服务的客户机中使用它们 因此,我创建了以下项目:C# 将实体框架数据注释添加到另一个项目&x27;s级,c#,.net,entity-framework,entity-framework-6,C#,.net,Entity Framework,Entity Framework 6,假设我有一组我想在多个项目中共享的类。例如,我可以在REST服务中使用它们,也可以在使用该服务的客户机中使用它们 因此,我创建了以下项目: 我的订单,模型 密勒德斯雷斯塔皮酒店 我的订单,客户 RestApi和客户机项目都依赖于Models项目 RestApi使用的是实体框架(代码优先),因此通常您会使用[NotMapped]和[Key]等内容来装饰模型的属性。但是,我不希望客户端解决方案对实体框架有任何依赖性。没有一个所以我不能用特定于EF的属性来修饰模型的属性 因此,我的问题是,是否有某
- 我的订单,模型
- 密勒德斯雷斯塔皮酒店
- 我的订单,客户
[NotMapped]
和[Key]
等内容来装饰模型的属性。但是,我不希望客户端解决方案对实体框架有任何依赖性。没有一个所以我不能用特定于EF的属性来修饰模型的属性
因此,我的问题是,是否有某种方法可以正确设置RestApi项目中模型的特定于EF的属性,可能是在上下文的构造函数中还是在其他地方?这是使用独立于类似表的实体的自定义数据传输对象的一个很好的论据。尽管拥有几乎重复的类(一个作为DTO,一个作为EF实体)感觉有些过分,但还有另一个长期的好处:这两组类可以独立变化。假设您更改了表结构,但客户机不需要知道此更改。更新EF实体,但不要使用DTO,尽管可能需要更新从EF映射到DTO的方式
说到映射:EmitMapper在两种类型的对象之间进行转换时非常有帮助 这是使用独立于表实体的自定义数据传输对象的一个很好的理由。尽管拥有几乎重复的类(一个作为DTO,一个作为EF实体)感觉有些过分,但还有另一个长期的好处:这两组类可以独立变化。假设您更改了表结构,但客户机不需要知道此更改。更新EF实体,但不要使用DTO,尽管可能需要更新从EF映射到DTO的方式
说到映射:EmitMapper在两种类型的对象之间进行转换时非常有帮助 您需要使用将数据访问模型与应用程序的其余部分分开 这将带来很多好处。首先,它将检查您是否复制了模型的所有代码。但是当您的应用程序增长时,您会发现您需要以另一种方式格式化视图中的数据,而不是将其存储在数据库中。验证属性可以按照您需要的方式以非常特定的方式添加
它们之间的映射可以通过各种方式完成。手动或使用类似于的工具,您需要使用将数据访问模型与应用程序的其余部分分离 这将带来很多好处。首先,它将检查您是否复制了模型的所有代码。但是当您的应用程序增长时,您会发现您需要以另一种方式格式化视图中的数据,而不是将其存储在数据库中。验证属性可以按照您需要的方式以非常特定的方式添加
它们之间的映射可以通过各种方式完成。手动或使用类似的工具,您可以在
模型
项目中拥有POCO,让它们完全不知道实体框架,并在单独的项目或重新启动PI
项目本身中进行映射
您可以通过fluent mapping API实现这一点,例如在OnModelCreating
覆盖您在EF aware项目中创建的上下文中:
modelBuilder.Entity<Order>().HasKey(o => o.OrderID);
modelBuilder.Entity<Order>().Ignore(o => o.OrderTotal);
modelBuilder.Entity().HasKey(o=>o.OrderID);
modelBuilder.Entity().Ignore(o=>o.OrderTotal);
等等。您可以在
模型
项目中拥有POCO,让它们完全不知道实体框架,并在单独的项目中或在RestApi
项目本身中进行映射
您可以通过fluent mapping API实现这一点,例如在OnModelCreating
覆盖您在EF aware项目中创建的上下文中:
modelBuilder.Entity<Order>().HasKey(o => o.OrderID);
modelBuilder.Entity<Order>().Ignore(o => o.OrderTotal);
modelBuilder.Entity().HasKey(o=>o.OrderID);
modelBuilder.Entity().Ignore(o=>o.OrderTotal);
等等。创建映射到数据模型的单独实体类,然后创建来回映射到客户机类的映射。属性是编译时构造,不能在运行时添加。可以使用fluent code first API定义所有内容,而不是使用属性装饰模型。创建映射到数据模型的单独实体类,然后创建来回映射到客户端类的映射。属性是编译时构造,不能在运行时添加。您可以使用fluent code first API定义所有内容,而不是用属性装饰模型。