【问题标题】:Configure Backing Field of Different Type配置不同类型的支持字段
【发布时间】:2019-10-16 17:50:24
【问题描述】:
        private int _billAccount;
        public string BillAccount { get
            {
                var account = _billAccount.ToString().PadLeft(9, '0');
                return account.Substring(0, 3) + "-" + account.Substring(3, 3) + "-" + account.Substring(6, 3);
            }
            set
            {
                var account = new string(value.Where(char.IsDigit).ToArray());
                _billAccount = Convert.ToInt32(account);
            }
        }

类中的 BillAccount 属性将字符串表示形式处理为 (999-999-999)。表中的列定义为

BillAccount INT NOT NULL

我尝试过使用

.HasField("_billAccount")
.HasConversion(new NumberToStringConverter<int>())

以及我能想到的任何其他组合,但我无法让它发挥作用。

System.InvalidOperationException:指定字段“_billAccount” 'int' 类型的不能用于属性 'Lead.BillAccount' 输入“字符串”。仅支持可分配类型的字段 属性类型可以使用

如何在 EF Core 3 中进行配置,Fluent API 使字段 _billAccount 映射到表列 BillAccount,即使它们具有不同的类型?

【问题讨论】:

  • BillAccount 保留为int 并使用未映射的属性进行翻译。

标签: c# entity-framework-core fluent


【解决方案1】:

正如@madreflection 所暗示的那样:

public class TheModel {

    private int _billAccount;
    private string _formattedBillAccount = string.Empty;
    public int BillAccount {
        get { return _billAccount; }
        set { 
            _billAccount = value;  
            _formattedBillAccount = value.ToString().PadLeft(9, '0');
            _formattedBillAccount = $"{_formattedBillAccount.Substring(0, 3)}-{_formattedBillAccount.Substring(3, 3)}-{_formattedBillAccount.Substring(6, 3)}";
        }
    }

    [NotMapped]
    public string FormattedBillAccount { get { return _formattedBillAccount; } }
}

【讨论】:

  • 某种...这肯定会起作用,但我想更多的是让FormattedBillAccountget访问器按需创建字符串,它会有一个@987654324 @ 会解析它的访问器。访问器中的双向翻译,而不是另一个字段中的缓存值。
  • @madreflection:当然。我选择了这条路线,因为我认为读取格式化的数字将是比设置值更常见的任务。因此,这将最大限度地减少这种情况下的分配和 CPU 时间。但是,如果读取不如设置值那么常见,那么在 get 访问器中执行它会很棒。在任何一种情况下,为双向绑定添加一个 set 访问器都是一个好主意。作为练习留给读者。
  • 所有公平和优秀的观点。我删除了之前的评论,因为它是一大堆蠕虫,但我建议使用可以解析帐号(可能来自用户输入)并转换回字符串的域对象。然后它也可以转换为int 或从int 转换,尽管我认为将帐号存储为 int 是一个糟糕的设计选择(我撤回它的另一个原因)。属性中的翻译将是一个几乎可以插入的中间步骤。
  • @madreflection 格式是为了让界面中的人更容易阅读,但是很多相关系统都要求它是一个int。如果我存储格式化版本,我必须为任何下游系统剥离格式化。以前的 webforms 版本使用带有格式化字符串属性的 int 字段来促进两者。
猜你喜欢
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
  • 2012-03-16
  • 2017-04-08
相关资源
最近更新 更多