使用Entity Framework 6创建计算属性

时间:2018-03-04 16:22:02

标签: c# winforms entity-framework-6 ef-database-first computed-properties

我正在使用Database First方法,我已经从数据库创建了模型。现在我在Winforms应用程序中有一个datagrid视图,它绑定到绑定源。一切正常(数据网格视图中显示了适当的数据)。现在的问题是,如何添加一个由两个值组成的计算属性(已在db中找到)?举个例子:

假设我有一个表用户(id,username,first_name,last_name,user_type),但我希望在绑定数据网格视图中有不同的列,我想要这些列:

username, full name, type

其中"full name"是我first_name + " " + last_name所能得到的。

我想我不能像这样手动修改模型类:

public string FullName
{
    get
    {
        return FirstName + " " + LastName;
    }
    protected set {}
}

因为这个类是自动生成的,每次从现有数据库生成模型时(我做一些更改时)都会删除我的代码,所以这不是真正的选择......

2 个答案:

答案 0 :(得分:0)

我仍然无法添加评论,所以我必须这样做。

关于您的方法,为什么不创建将绑定到数据网格视图的数据传输模型?

使用这种方法,您的新模型将具有所需的属性FullName,您可以在网格视图中显示它。您的数据库实体模型将保持不变。通过这种方式,您可以将数据库模型与视图模型分离,并实现您想要的效果。

更新:

/// <summary>
///     Assuming this is the EF model, generated with the database first approach. We leave it as is.
/// </summary>
public class UserEntityModel
{
    public int Id { get; set; }

    public string UserName { get; set; } 

    public string FirstName { get; set; }

    public string LastName { get; set; }

    public int UserType { get; set; }
}

/// <summary>
///     This model represents your grid presentation specific data. As you can see, we have the fields 
///     that we will show. This is the new DTO model
/// </summary>
public class UserGridViewModel
{
    public string UserName { get; set; }

    public string FullName { get; set; } 

    public int UserType { get; set; }
}

/// <summary>
///     This method demonstrates the retrieving and model to model mapping.
/// </summary> 
public UserGridViewModel GetUser(int userId)
{
      //retrieve the UserEntityModel
      var efObject = _context.User.Where(user => user.Id == userId).SingleOrDefault();

       if (efObject  == null) {
          return null;
       }

       // construct the new object, set the required data 
       return new UserGridViewModel()
       {
            UserName = efObject.UserName,
            UserType = efObject.UserType,
            FullName = $"{efObject.FirstName} {efObject.LastName}"
        };
}

补充说明: 我们假设UserEntityModel是您的数据库第一个生成的数据模型。 我们将原样保留。

我们将创建第二个模型UserGridViewModel,其中仅包含您将在网格中显示的数据。这是DTO模型。

GetUser方法应该在概念上演示第一个(ef模型)和第二个(DTO)模型的用法。我们从数据库中检索数据,构建DTO模型并将其传递给网格。

您可以找到更多信息herehere

希望这有助于,欢呼和快乐的编码!

答案 1 :(得分:0)

实际上,我通过使用分部类功能解决了这个问题: 我创建了另一个文件,其中包含我的User模型类的另一部分(带有我的附加属性),一切都很顺利。

namespace User.Model
{
    public partial class User
    {
        public string FullName
        {
            get
            {
                return (this.firstName + " " + this.lastName;
            }
            protected set { }
        }
    }
}

现在,当我生成模型类时,这个新文件不受EF的影响。数据网格视图也正确显示了这个新字段...