我将MVC5与EF6结合使用,出现以下转换错误
无法将类型隐式转换
System.Collections.Generic.List<TreaceabilitySystem.GLB_M_PROFITCENTER>
为System.Collections.Generic.List<TreaceabilitySystem.Models.Profitcenter>
private TSEntities db = new TSEntities();
// GET: Profitcenter
public ActionResult Index()
{
List<Profitcenter> profitcenter = new List<Profitcenter>();
profitcenter = db.GLB_M_PROFITCENTER.ToList(); //Error coming up here
return View(profitcenter.ToList());
}
我的模型在这里:当我在.edmx中添加表时,该模型是通过EF创建的
public partial class GLB_M_PROFITCENTER
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public GLB_M_PROFITCENTER()
{
this.GLB_M_USERMASTER = new HashSet<GLB_M_USERMASTER>();
}
public string PROFITCENTER_CODE { get; set; }
public string PROFITCENTER_NAME { get; set; }
public string DESCRIPTION { get; set; }
public bool ISACTIVE { get; set; }
public int CREATEDBY { get; set; }
public System.DateTime CREATED_DATE { get; set; }
public Nullable<int> UPDATEDBY { get; set; }
public Nullable<System.DateTime> UPDATED_DATETIME { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<GLB_M_USERMASTER> GLB_M_USERMASTER { get; set; }
}
我创建了以下模型,用于更改显示名称和验证目的
[MetadataType(typeof(Profitcenter))]
public partial class GLB_M_PROFITCENTER { }
public class Profitcenter
{
[Required(ErrorMessage = "*")]
[DisplayName("Profitcenter Code")]
public string PROFITCENTER_CODE { get; set; }
[Required(ErrorMessage = "*")]
[DisplayName("Profitcenter Name")]
public string PROFITCENTER_NAME { get; set; }
[DisplayName("Description")]
public string DESCRIPTION { get; set; }
[DisplayName("Is Active")]
public bool ISACTIVE { get; set; }
[DisplayName("Created By")]
public int CREATEDBY { get; set; }
[DisplayName("Created Timestamp")]
public System.DateTime CREATED_DATE { get; set; }
[DisplayName("Upated by")]
public Nullable<int> UPDATEDBY { get; set; }
[DisplayName("Updated Timestamp")]
public DateTime UPDATED_DATETIME
{
get; set;
}
}
两种型号完全一样,我是否缺少任何东西?我该如何解决?
两种型号完全相同
这并不意味着您可以将一个分配给另一个。为了使此代码起作用:
Foo foo = new Foo();
Bar bar = foo;
Bar
必须是的基本类型Foo
。这里不是这种情况,您的Bar
和Foo
恰好具有相同的属性名称。
您需要从一个映射到另一个:
public Profitcenter Map(GLB_M_PROFITCENTER input)
{
return new Profitcenter
{
PROFITCENTER_CODE = input.PROFITCENTER_CODE,
...
};
}
您可以使用Select()
以下命令对整个列表进行映射:
List<Profitcenter> profitcenter = new List<Profitcenter>();
profitcenter = db.GLB_M_PROFITCENTER.Select(Map).ToList();
自动化的方法是使用AutoMapper,如果双方的所有属性都相同命名,则该方法特别有效。
但这只能部分回答您的问题。您有两种类型:GLB_M_PROFITCENTER
,由Entity Framework生成的代表数据库表的类,和Profitcenter
,其中添加了可用于使用该MetadataType
属性进行输入验证的属性。
我不喜欢后者,因为您随后将实体框架模型用作UI层的视图模型。您不应该这样做,您可以MetadataType
从部分类定义中删除该属性。
因此,您既可以使用MetadataType,也不要真正实例化该类型(毕竟,它是一个元数据类型):
List<GLB_M_PROFITCENTER> profitcenter = db.GLB_M_PROFITCENTER.ToList();
return View(profitcenter);
并发表您的看法@model IEnumerable<GLB_M_PROFITCENTER>
。然后,MVC将读取的MetadataType
属性GLB_M_PROFITCENTER
,并应用已应用的元数据(DisplayName
,...)Profitcenter
(但不应这样做)。
或者,您可以简单地应用映射,从而将视图模型与实体模型(进而与数据库)分离,并获得所有其他好处。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句