Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架-MVC-将从模型中的数据库(POCO对象)请求的数据类型转换为视图中使用的业务对象_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# 实体框架-MVC-将从模型中的数据库(POCO对象)请求的数据类型转换为视图中使用的业务对象

C# 实体框架-MVC-将从模型中的数据库(POCO对象)请求的数据类型转换为视图中使用的业务对象,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我正在使用MVC模式和实体框架4.1。我有三个项目:模型(M)、视图(V)和控制器(C) 由于模型和视图使用不同的实体(尽管它们具有相同的属性和名称,但由于属于不同的名称空间,它们被视为不同的对象),因此我必须将数据从模型对象转换为视图对象。这个转换是使用我在上面评论的项目MV中包含的接口(InterfaceMV)中的转换器(接口)完成的。接口EMV如下所示: public interface IDataTypeConverterEntityA { string Property1 {g

我正在使用MVC模式和实体框架4.1。我有三个项目:模型(M)、视图(V)和控制器(C)

由于模型和视图使用不同的实体(尽管它们具有相同的属性和名称,但由于属于不同的名称空间,它们被视为不同的对象),因此我必须将数据从模型对象转换为视图对象。这个转换是使用我在上面评论的项目MV中包含的接口(InterfaceMV)中的转换器(接口)完成的。接口EMV如下所示:

public interface IDataTypeConverterEntityA
{
    string Property1 {get; set;}
    int Property2 {get; set; }
}
接口EMV由模型中的EntityA和视图中的EntityA实现。因此,一旦我从视图中从模型中检索数据:

         Namespace.Model.EntityA a = context.EntitiesA.Find(id);
// I retrieve the matching entity from the context
EntityA aConverted = DataTypeConverter.Convert<Namespace.Model.EntityA, EntityA>(a);
我必须将“a”对象(类型为Namespace.Model.EntityA)转换为视图中的等效对象:

         EntityA aConverted = DataTypeConverterEntityA.Convert<Namespace.Model.EntityA, EntityA>(a);
EntityA aConverted=DataTypeConverterEntityA.Convert(a);
转换器的名称如下所示(它位于DataTypeConverterEntityA类中):

公共静态Y转换(T itemToConvert)
其中T:new(),IDataTypeConverterEntityA
其中Y:new(),IDataTypeConverterEntityA
{
返回新的Y
{
property1=itemToConvert.property1,
property2=itemToConvert.property2
};
}
基本上,我有表示数据库中表的POCO实体,我有一些业务类,我使用转换器从一个转换到另一个

问题如下: 1.-由于包含接口EMV的project MV既不引用模型也不引用视图,因此转换方法只能转换标量类型,而不能转换其他类型,例如EntityB属性,因此一旦获得转换对象A并在视图中转换:

         Namespace.Model.EntityA a = context.EntitiesA.Find(id);
// I retrieve the matching entity from the context
EntityA aConverted = DataTypeConverter.Convert<Namespace.Model.EntityA, EntityA>(a);
//我从上下文中检索匹配的实体
EntityA aConverted=DataTypeConverter.Convert(a);
我必须对数据库执行另一个请求以获取EntityB,然后将其转换,最后通过执行以下操作将其从视图分配到EntityA.EntityB:

// I retrieve the matching entity from the context
Namespace.Model.EntityA a = context.EntitiesA.Find(id);
EntityA aConverted = DataTypeConverterEntityA.Convert<Namespace.Model.EntityA, EntityA>(a);

// Inject values into the entity
Namespace.Model.EntityB b = context.EntitiesB.Find(id);
EntityB bConverted = DataTypeConverterEntityB.Convert<Namespace.Model.EntityB, EntityB>(b);

aConverted.entityB = bConverted;
//我从上下文中检索匹配的实体
Namespace.Model.EntityA a=context.EntitiesA.Find(id);
EntityA a a converted=DataTypeConverterEntityA.Convert(a);
//将值注入实体
Namespace.Model.EntityB=context.EntitiesB.Find(id);
EntityB bConverted=DataTypeConverterEntityB.Convert(b);
aConverted.entityB=b转换;
2.-如您所见,我必须为每个实体配备一个转换器,因为从视图中,我无法处理从数据库请求接收的对象,因为视图使用自己的实体。。。。。显然,我必须在每个实体中实现接口,模型实体和视图实体中的接口

原因是我完全隔离了模型项目,它使用自己的实体,视图也使用自己的实体

也许将实体(EntityA、EntityB等)仅保留在一个位置并在模型和视图之间共享它们可以解决此问题。。。。避免使用数据类型转换器

所以我的问题是:有没有更好的方法避免每次使用数据类型转换器?或者,您认为这种架构很好,因为它将模型与视图隔离开来?使用这种方法,如果您在视图中更改了它的实体,则不会影响它的模型,因为它有自己的实体。我的问题是每次都使用数据类型转换器


有什么想法吗?

不确定这是否真的是堆栈溢出的问题(感觉太像“你对……有什么看法”),但由于你花了时间输入了这么长的解释,我将提供我的两分钱:

我觉得你的设计太复杂了。有一句格言是关于“解决方案的复杂性不应超过问题的复杂性”,感觉就像你已经做到了(如果没有问题的具体背景知识,很难说)。值得一提的是,我发现SoC和复杂性之间的最佳折衷方式是:

  • 数据项目。提供对数据存储的编程访问 (数据库、XML等)
  • 域项目。提供业务逻辑/规则的实现。我 这里还定义了我的DTO
  • 用户界面项目。假设您正在开发一个供用户使用的工具 该项目直接提供网站、控制台或桌面 app,且仅限于基本验证(为必需值 例如,提供)
  • 如果我需要散列或加密例程,我倾向于将它们放在第四个项目中,但它们也可以与域项目一起使用

    根据这种设计,域项目引用数据项目,UI项目引用域项目。大部分工作发生在域项目中,数据项目通常只是数据存储的包装器,UI项目将用户请求路由到适当的域逻辑


    HTH.

    不确定这是否真的是堆栈溢出的问题(感觉太像“你对……有什么看法”),但由于你花了时间输入了这么长的解释,我将提供我的两分钱:

    我觉得你的设计太复杂了。有一句格言是关于“解决方案的复杂性不应超过问题的复杂性”,感觉就像你已经做到了(如果没有问题的具体背景知识,很难说)。值得一提的是,我发现SoC和复杂性之间的最佳折衷方式是:

  • 数据项目。提供对数据存储的编程访问 (数据库、XML等)
  • 域项目。提供业务逻辑/规则的实现。我 这里还定义了我的DTO
  • 用户界面项目。假设您正在开发一个供用户使用的工具 该项目直接提供网站、控制台或桌面 app,且仅限于基本验证(为必需值 例如提供的)。
  • public static Y Convert<T, Y>(T itemToConvert) where T : new(), IDataTypeConverterEntityA where Y : new(), IDataTypeConverterEntityA { return new Y { property1 = itemToConvert.property1, property2 = itemToConvert.property2 }; }
    // I retrieve the matching entity from the context
    EntityA aConverted = DataTypeConverter.Convert<Namespace.Model.EntityA, EntityA>(a);
    
    // I retrieve the matching entity from the context
    Namespace.Model.EntityA a = context.EntitiesA.Find(id);
    EntityA aConverted = DataTypeConverterEntityA.Convert<Namespace.Model.EntityA, EntityA>(a);
    
    // Inject values into the entity
    Namespace.Model.EntityB b = context.EntitiesB.Find(id);
    EntityB bConverted = DataTypeConverterEntityB.Convert<Namespace.Model.EntityB, EntityB>(b);
    
    aConverted.entityB = bConverted;