如何为edmx设计器类创建视图模型和地图

时间:2011-12-21 11:04:05

标签: asp.net-mvc

任何人都可以提供用于为edmx设计器类创建视图模型的链接

假设我的edmx文件名为School.edmx,它有school.Designer.cs类。 在设计器类中,我有下面的实体对象

[EdmEntityTypeAttribute(NamespaceName="teamworkModel", Name="User")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class User : EntityObject
{

    #region Primitive Properties

    [EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.Int32 User_Pk
    {
        get
        {
            return _User_Pk;
        }
        set
        {
            if (_User_Pk != value)
            {
                OnUser_PkChanging(value);
                ReportPropertyChanging("User_Pk");
                _User_Pk = StructuralObject.SetValidValue(value);
                ReportPropertyChanged("User_Pk");
                OnUser_PkChanged();
            }
        }
    }
    private global::System.Int32 _User_Pk;
    partial void OnUser_PkChanging(global::System.Int32 value);
    partial void OnUser_PkChanged();


    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    [Required(ErrorMessage="Please enter your name")]
    [StringLength(20,ErrorMessage="Name cannot exceed 20 characters")]
    [RegularExpression(@"^([a-zA-Z0-9 \.\&\'\-]+)$", ErrorMessage = "Invalid name")]
    public global::System.String User_Name
    {
        get
        {
            return _User_Name;
        }
        set
        {
            OnUser_NameChanging(value);
            ReportPropertyChanging("User_Name");
            _User_Name = StructuralObject.SetValidValue(value, false);
            ReportPropertyChanged("User_Name");
            OnUser_NameChanged();
        }
    }
    private global::System.String _User_Name;
    partial void OnUser_NameChanging(global::System.String value);
    partial void OnUser_NameChanged();


    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    [Email(ErrorMessage="Invalid email address")]
    [Required(ErrorMessage="Please enter email address")]
    public global::System.String User_Mail_Id
    {
        get
        {
            return _User_Mail_Id;
        }
        set
        {
            OnUser_Mail_IdChanging(value);
            ReportPropertyChanging("User_Mail_Id");
            _User_Mail_Id = StructuralObject.SetValidValue(value, false);
            ReportPropertyChanged("User_Mail_Id");
            OnUser_Mail_IdChanged();
        }
    }
    private global::System.String _User_Mail_Id;
    partial void OnUser_Mail_IdChanging(global::System.String value);
    partial void OnUser_Mail_IdChanged();


    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    [Required(ErrorMessage="Please enter password")]
    [StringLength(20,ErrorMessage="Password cannot exceed 20 characters")]
    [RegularExpression(@"^([a-zA-Z0-9 \.\&\'\-]+)$", ErrorMessage = "Invalid password")]
    public global::System.String User_Password
    {
        get
        {
            return _User_Password;
        }
        set
        {
            OnUser_PasswordChanging(value);
            ReportPropertyChanging("User_Password");
            _User_Password = StructuralObject.SetValidValue(value, false);
            ReportPropertyChanged("User_Password");
            OnUser_PasswordChanged();
        }
    }
    private global::System.String _User_Password;
    partial void OnUser_PasswordChanging(global::System.String value);
    partial void OnUser_PasswordChanged();


    [EdmScalarPropertyAttribute(EntityKeyProperty=false, IsNullable=false)]
    [DataMemberAttribute()]
    public global::System.DateTime User_Creation_Date
    {
        get
        {
            return _User_Creation_Date;
        }
        set
        {
            OnUser_Creation_DateChanging(value);
            ReportPropertyChanging("User_Creation_Date");
            _User_Creation_Date = StructuralObject.SetValidValue(value);
            ReportPropertyChanged("User_Creation_Date");
            OnUser_Creation_DateChanged();
        }
    }
    private global::System.DateTime _User_Creation_Date;
    partial void OnUser_Creation_DateChanging(global::System.DateTime value);
    partial void OnUser_Creation_DateChanged();

我在上面的实体对象(User表)中有以下列User_PK,User_Name,User_Password,User_Email_ID .....

请有人建议如何为包含除User_Password和User_Email_ID之外的所有上述列的上述实体对象创建视图模型,因为我需要将其用作我的视图的强类型视图模型。我还需要在其中使用另一个表具有所选列的相同viewmodel ....

我经历了很多文件......我已经花了一天半的时间 任何人都可以帮忙.. 我知道这个问题是反复问的,但我找不到正确的方法...... 感谢

3 个答案:

答案 0 :(得分:1)

编辑:已修改以回答有关其他实体的额外属性的评论

这可能会有所帮助

public class UserViewModel
{
public int Pk{get;private set;}
public string Name{get;set;}
public DateTime CreationDate{get;set;}
public string ProjectName{get;set;}
public DateTime ProjectCreated{get;set;}
}

ViewModel是您实体的扁平化版本。

答案 1 :(得分:1)

您必须自己编写viewmodel类。 只需创建一个名为MyWebApp.Models.User的类,其中包含您需要的属性,并在控制器中将edmx类映射到它。

对于映射,我建议使用automapper,这使得映射生活更轻松。

修改 这是你使用automapper的方法: 假设您的DAL类名为User,您的viewmodel类称为UserViewModel。

您必须告诉automapper您要映射哪些类:

AutoMapper.Mapper.CreateMap<User, UserViewModel>();

然后,您可以使用一行将对象从一种类型映射到另一种类型:

User user = dal.GetUser();
UserViewModel model = AutoMapper.Mapper.Map<User, UserViewModel>(user);

Automapper甚至可以映射对象集合。因此,如果您的模型具有IEnumerable<Projects>之类的属性,那么它也会映射此属性。

答案 2 :(得分:0)

我通过右键单击edmx设计图面并选择Add Code Generation Item&gt;让VS为我做大部分工作。 EF 5.x DBContext Generator&gt;添加。

然后,您应该在与edmx文件相同的文件夹中看到[xxx] .tt文件。如果展开此文件,您应该会看到每个实体的POCO类。

我将所需的实体复制到我的viewmodel中并删除我不需要的实体。

一旦我对我的viewmodel感到满意,我会删除[xx] .tt文件,右键单击edmx设计图面上的属性&gt;属性&gt; <代码生成策略>默认。

我也强烈建议在答案中提到使用Automapper。