【问题标题】:how to create a viewmodel and map for the edmx designer class如何为 edmx 设计器类创建视图模型和地图
【发布时间】:2011-12-21 11:04:04
【问题描述】:

谁能提供一个为 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_PK,User_Name,User_Password,User_Email_ID中有以下列.....

请任何人都可以建议如何为上述实体对象创建一个视图模型,该对象包含除 User_Password 和 User_Email_ID 之外的所有上述列,因为我需要将它用作我的视图的强类型视图模型。我还需要在具有选定列的相同视图模型....

我浏览了很多文件..我已经为此花了 1 天半的时间 任何人都可以帮助.. 我知道这个问题被反复问过,但我找不到正确的方法...... 谢谢

【问题讨论】:

    标签: asp.net-mvc


    【解决方案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 是实体的扁平化版本。

    【讨论】:

    • 谢谢,但我如何在同一个视图模型中包含具有选定列的其他实体对象。假设我有项目表,我必须在其中包含项目名称和项目创建日期列以及如何映射它...
    • 我想我会有多个项目,所以我应该使用 List 作为项目名称。?你能举一个关于我的情况使用映射的简短例子吗
    • var model = new User{User_Pk=userViewModel.Pk....} var model2 = new Project{Name=userViewModel.Name...}
    • 非常感谢..我实际上是在寻找要使用的自动映射器...你能为我的场景建议一个好的链接
    • 看看 automapper wiki Jimmy Bogard 有很好的文档Automapper Wiki
    【解决方案2】:

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

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

    编辑 这是您使用自动映射器的方式: 假设您的 DAL 类称为 User,而您的视图模型类称为 UserViewModel。

    你必须告诉 automapper 你想映射哪些类:

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

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

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

    Automapper 甚至可以映射对象集合。因此,如果您的模型具有像 IEnumerable&lt;Projects&gt; 这样的属性,它也会映射它。

    【讨论】:

    • 请告诉我如何使用自动映射器
    • 但是它如何映射Project实体对象...?
    • @bhargav:Automapper 会处理这个问题。它也可以映射到 List/IEnumerable/Array 类型。我更新了我的答案。
    【解决方案3】:

    我让 VS 为我完成大部分工作,方法是右键单击 edmx 设计界面并选择添加代码生成项 > EF 5.x DBContext Generator > 添加。

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

    我根据需要将实体复制到我的视图模型中并删除我不需要的实体。

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

    我还强烈建议使用 Jan 在他的回答中提到的 Automapper。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 2011-08-02
      • 2023-03-04
      • 1970-01-01
      • 2016-05-27
      • 1970-01-01
      相关资源
      最近更新 更多