如何在MVC中将我自己的Model类与EF实体类结合使用?

时间:2012-05-10 14:30:28

标签: asp.net-mvc asp.net-mvc-3 entity-framework ado.net

所以我是MVC的新手,现在正在使用MVC3和实体框架。我目前正在使用Model / Schema 1st方法,因为数据库已经存在。因此,我创建了我的ADO.NET实体数据模型(.edmx),我在我的MVC应用程序中拥有所有需要的实体。到目前为止,这一切都很好。

但是,假设我的某个实体是“客户”实体。我可以在MyEntites.Designer.cs中看到自动生成的partial类继承自EntityObject。此时我想为我的MVC模型添加一些自定义业务逻辑。我觉得答案是使用我自己的partial类在名为'Customer'的模型中创建。

在提出问题并查看有关POCO,T4模板,修改自动生成的代码等的各种信息之后,我做了很多搜索,并且丢失了。将我自己的业务逻辑和自定义代码添加到EF的自动生成实体是否是一种巨大的痛苦?我当然不想一遍又一遍地修改自动生成的代码。

我需要一个直接的解释,让众所周知的'灯泡'继续下去,然后我可以从那里起飞。有人可以帮我解答一下如何做到这一点吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

将您自己的类代码保存在不同的文件中,但使用相同的类和命名空间。这有助于避免代码被T4代码生成器覆盖。

Extending Entity Framework Generated Types

您还可以使用元类向生成的类添加属性:

Adding Attributes to Generated Classes

答案 1 :(得分:2)

这些代码是自动生成的,并且会在每次更新或更改时覆盖。

您可以通过扩展模型实现所需。假设EF为您生成了以下实体类:

namespace YourSolution
{
    using System;
    using System.Collections.Generic;

    public partial class News
    {
        public int ID { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }        
        public int UserID { get; set; }

        public virtual UserProfile User{ get; set; }
    }
}

并且您想要做一些工作来保存您的数据注释和属性。因此,请按照以下步骤操作:

首先,在下面添加两个类(在任何你想要的地方,但最好是在Models中),如下所示:

namespace YourSolution
{
    [MetadataType(typeof(NewsAttribs))]
    public partial class News
    {
         // leave it empty.
    }

    public class NewsAttribs
    {            
        // Your attribs will come here.
    }
}

然后在此处将您想要的属性和属性添加到第二个类 - NewsAttribs。 :

public class NewsAttrib
{
    [Display(Name = "News title")]
    [Required(ErrorMessage = "Please enter the news title.")]
    public string Title { get; set; }

    // and other properties you want...
}

备注:

1)生成的实体类的名称空间和您的类必须相同 - 这里YourSolution

2)您的第一堂课必须partial且其名称必须与EF生成的课程相同。

通过这个,你的属性再也没有丢失......