使用具有一对多关系的支持字段

时间:2018-01-14 22:18:28

标签: database entity-framework asp.net-core

我有一种情况,我有实体,应该公开一个用户列表,我只希望暴露IEnumerable,而不是List。所以我使用支持字段来实现这一目标。如下所示:

public class Entity
{
    private readonly List<User> invitedUsers = new List<User>()

    public IEnumerable<User> InvitedUsers => invitedUsers;

    public void AddInvitedUser(User user)
    {
        invitedUsers.Add(user);
    }
}

现在在存储库的某个地方,我这样做:

var user = new User();

var items = context.Items;

items.First().AddInvitedUser(user);

context.SaveChanges();

在我的模型构建器中,我将导航属性设置为使用支持字段

var navigation = modelBuilder.Entity<Entity>().
        Metadata.FindNavigation(nameof(Entity.InvitedUsers));
        navigation.SetPropertyAccessMode(PropertyAccessMode.Field);

据我所知,这是我应该做的一切来使这项工作。但是,每次访问同一个实体时,它都不会加载持久化的用户,甚至不会向数据库创建“用户”列(迁移已完成)。我在这里错过了什么?提前致谢

1 个答案:

答案 0 :(得分:0)

我刚才遇到了同样的问题。这就是我能够为列表设置私有后备字段的方式。

public class Entity
{
    private readonly List<User> _invitedUsers = new List<User>()

    public IReadOnlyCollection<User> InvitedUsers => _invitedUsers;

    public void AddInvitedUser(User user)
    {
        invitedUsers.Add(user);
    }
}

这就是我设置DbContext的方式:

var navigation = modelBuilder.Entity<Entity>().
    .HasMany(d => d.InvitedUsers)
                .WithOne(p => p.Entity) // notice that in your case this might be empty.. simply .WithOne()
                .HasForeignKey(d => d.EntityId)
      .Metadata.DependentToPrincipal.SetPropertyAccessMode(PropertyAccessMode.Field);