【问题标题】:Consolidate FirstName/LastName into FullName ASP.NET Core Identity将 FirstName/LastName 合并为 FullName ASP.NET Core Identity
【发布时间】:2018-05-08 15:31:41
【问题描述】:

我在 ASP.NET Core 2.0 中使用 EF Core 代码优先模型。

为了简化模型,我尝试合并ApplicationUser 模型的FirstNameLastName 字段:

public class ApplicationUser : IdentityUser<int>
...
public string FirstName { get; set; }
public string LastName { get; set; }
...

...
public string FullName { get; set; }
...

但是,当我提供种子数据时:

...
FullName = "Test McTesterson"

SQL 服务器只保存姓氏。

我的假设是我可以使用某种属性来装饰我的字段以在字符串中包含两个名称?

提前致谢。

【问题讨论】:

  • 您希望数据库中存在一个名为FullName 的字段吗?或者您只是想在客户端(也就是您的代码)上查看这两个字符串的连接?
  • 只创建一个持久计算列
  • 如果您将全名设置为Bob Andrew Smith,您期望会发生什么?名字和姓氏是不同的属性是有充分理由的
  • 为什么数据库中有这样一个字段?这样做的目的是什么?
  • 你没有简化任何事情。相反,正如其他人所建议的那样,当您必须处理奇怪的名称时,您将增加 [未来] 的复杂性。在下面查看我的答案,了解简化模型使用的替代方案。

标签: c# asp.net sql-server entity-framework


【解决方案1】:

如果目标是简化模型的使用,我建议改为实现计算域:

public string FullName 
{ 
    get { return string.Format("{0} {1}", FirstName, LastName); }
}

如果你想变得更漂亮,你可以添加一个允许格式化的方法:

public string GetFullName(string format)
{
    return string.Format(format, FirstName, LastName);
} 

示例用法:

var name = user.GetFullName("{0} {1}"); //returns John Doe
var name2 = user.GetFullName("{1}, {0}"); //returns Doe, John

【讨论】:

    【解决方案2】:

    正如其他人所说,计算域是要走的路。但是,对我来说最干净的解决方案是使用带有表达式主体的字符串插值:

    public string FullName => $"{FirstName} {LastName}";
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-25
      • 1970-01-01
      • 2018-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多