使用 Entity Framework 6 创建计算 属性
Creating a computed property with Entity Framework 6
我正在使用数据库优先方法,并且我已经从数据库创建了模型。现在我的 Winforms 应用程序中有一个数据网格视图,它绑定到绑定源。一切正常(适当的数据显示在数据网格视图中)。现在的问题是,如何添加由两个值(已在数据库中找到)组成的计算 属性 ?例如:
假设我有一个 table 用户(id、用户名、first_name、last_name、user_type),但我想在我的 绑定数据网格视图,我想要这些列:
username, full name, type
其中 "full name"
是我用 first_name + " " + last_name
得到的结果。
我想我不能像这样手动修改模型 class:
public string FullName
{
get
{
return FirstName + " " + LastName;
}
protected set {}
}
因为这个 class 是自动生成的,每次从现有数据库生成模型时(当我进行一些更改时)我的代码都会被删除,所以这不是真正的选择...
我还是不能加评论,只好这样了。
关于您的方法,您为什么不创建一个将绑定到数据网格视图的数据传输模型?
通过这种方法,您的新模型将具有所需的 属性 全名,您可以在网格视图中显示它。您的数据库实体模型将保持不变。这样,您就将数据库模型与视图模型分离并实现了您想要的。
更新:
/// <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 模型并将其传递给网格。
希望这对您有所帮助,干杯,祝您编码愉快!
实际上,我通过使用部分 class 功能解决了这个问题:
我创建了另一个文件,其中包含我的用户模型的另一部分 class(带有我的附加属性),一切都很好。
namespace User.Model
{
public partial class User
{
public string FullName
{
get
{
return (this.firstName + " " + this.lastName;
}
protected set { }
}
}
}
现在,当我生成模型 classes 时,这个新文件不受 EF 的影响。数据网格视图也正确显示了这个新字段...
我正在使用数据库优先方法,并且我已经从数据库创建了模型。现在我的 Winforms 应用程序中有一个数据网格视图,它绑定到绑定源。一切正常(适当的数据显示在数据网格视图中)。现在的问题是,如何添加由两个值(已在数据库中找到)组成的计算 属性 ?例如:
假设我有一个 table 用户(id、用户名、first_name、last_name、user_type),但我想在我的 绑定数据网格视图,我想要这些列:
username, full name, type
其中 "full name"
是我用 first_name + " " + last_name
得到的结果。
我想我不能像这样手动修改模型 class:
public string FullName
{
get
{
return FirstName + " " + LastName;
}
protected set {}
}
因为这个 class 是自动生成的,每次从现有数据库生成模型时(当我进行一些更改时)我的代码都会被删除,所以这不是真正的选择...
我还是不能加评论,只好这样了。
关于您的方法,您为什么不创建一个将绑定到数据网格视图的数据传输模型?
通过这种方法,您的新模型将具有所需的 属性 全名,您可以在网格视图中显示它。您的数据库实体模型将保持不变。这样,您就将数据库模型与视图模型分离并实现了您想要的。
更新:
/// <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 模型并将其传递给网格。
希望这对您有所帮助,干杯,祝您编码愉快!
实际上,我通过使用部分 class 功能解决了这个问题: 我创建了另一个文件,其中包含我的用户模型的另一部分 class(带有我的附加属性),一切都很好。
namespace User.Model
{
public partial class User
{
public string FullName
{
get
{
return (this.firstName + " " + this.lastName;
}
protected set { }
}
}
}
现在,当我生成模型 classes 时,这个新文件不受 EF 的影响。数据网格视图也正确显示了这个新字段...