无法将类型'System.Collections.Generic.List <MODEL#1>'隐式转换为'System.Collections.Generic.List <Model#2>

翠鸟

我将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;
            }
        }

两种型号完全一样,我是否缺少任何东西?我该如何解决?

CodeCaster

两种型号完全相同

这并不意味着您可以将一个分配给另一个。为了使此代码起作用:

Foo foo = new Foo();
Bar bar = foo;

Bar必须是的基本类型Foo这里不是这种情况,您的BarFoo恰好具有相同的属性名称。

您需要从一个映射到另一个:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档