0

我有一个User实体和一个EmailRecipient具有一对一关系的实体。电子邮件收件人也可以在没有相关用户实体的情况下创建。

如果附加/包含,我的实体从EmailRecipient实体获取Name,Surname和。我已设置属性以在返回用户属性之前返回支持字段值(如果它不为空),因此我可以根据需要指定替代名称。EmailAddressUser

保存 时EmailRecipient,EF 会查看和属性Name,并使用实体中的值填充表,而不是使用支持字段值。如果我没有明确设置值,我希望这些字段在数据库中保持为 NULL,即SurnameEmailAddressEmailRecipientUserrecipient.Name = "new name";

我的问题:如何使 EF 根据支持字段值而不是属性值填充选定的数据库字段?还是有完全不同的方法来解决这个问题?

电子邮件收件人实体:

public class EmailRecipient
{
    private string _name;
    public virtual string Name 
    { 
        get { return User == null ? _name : _name ?? User.Name; }
        set { _name = value; }
    }

    private string _surname;
    public virtual string Surname
    {
        get { return User == null ? _surname : _surname ?? User.Surname; }
        set { _surname = value; }
    }

    private string _emailAddress;
    public virtual string EmailAddress
    {
        get { return User == null ? _emailAddress : _emailAddress ?? User.EmailAddress; }
        set { _emailAddress = value; }
    }

    [Key, ForeignKey(nameof(UserId))]
    public User User { get; protected set; }
    public long? UserId { get; set; }
}
4

1 回答 1

0

经过进一步的挖掘,我想我已经找到了解决方案。仔细阅读微软的EF Core 支持字段文档,似乎我们可以明确要求 EF 读取和写入支持字段,而不是使用属性。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<EmailRecipient>().Property(x => x.Name)
        .UsePropertyAccessMode(PropertyAccessMode.Field);
}

支持字段保持不变null,直到Name设置了新字段recipient.Name = "new name";,因此,我可以使用该recipient.Name属性返回recipient._name(存储在数据库中),或者如果它为空,则recipient.User.Name

于 2019-08-29T20:02:28.150 回答