gpt4 book ai didi

c# - EntityFramework 和 ReadOnlyCollection

转载 作者:太空狗 更新时间:2023-10-29 18:26:42 25 4
gpt4 key购买 nike

我使用 EntityFramewotk 和代码优先方法。所以,我这样描述我的模型:

class Person
{
public long Id { get;set; }
public string Name { get;set; }
public ICollection<Person> Parents { get;set; }
}

但是,我的域逻辑不允许修改 Parents 集合(添加、删除),它必须是只读的(仅作为示例)。 EntityFramework 要求所有集合都有 ICollection<T>界面,它有Add方法(实现结果)和Remove方法等。我可以通过接口(interface)的显式实现来创建我自己的集合:

public class ParentsCollection : ICollection<Person>
{
private readonly HashSet<Person> _collection = new HashSet<Person>();
void ICollection<Person>.Add(Person item)
{
_collection.Add(item);
}

bool ICollection<Person>.Remove(Person item)
{
return _collection.Remove(item);
}

//...and others
}

这隐藏了 AddRemove方法,但根本不保护。因为我总是可以强制转换为 ICollection 并调用禁止的方法。

所以,我的问题是:

  • 有没有办法在 EntityFramework 中使用只读集合?

最佳答案

在 EF Core 中,您可以使用 backing fields 封装集合并实现真正的领域建模。 .因此,您可以将您的集合定义为私有(private)字段并将其公开为公共(public)只读属性,如下所示 _parentsParents

class Person
{
public long Id { get;set; }
public string Name { get;set; }
private List<Person> _parents = new List<Person>();
public IReadOnlyCollection<Person> Parents => _parents.AsReadOnly();
public void AddParent(Parent parent){
_parents.Add(parent);
}
}

如您所见,Parents 是一个只读集合,不允许消费者对其进行修改。

请注意,根据 ef core 的约定,_parents 被发现为支持字段。

关于c# - EntityFramework 和 ReadOnlyCollection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32031951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com