当前位置: 首页 > 知识库问答 >
问题:

实体框架只读集合

施飞鸿
2023-03-14

考虑一个域,其中客户、公司、雇员等拥有一个ContactInfo属性,该属性又包含一组地址、电话、电子邮件等。

以下是我的缩写联系人信息:

public class ContactInfo : Entity<int>
{
    public ContactInfo()
    {
        Addresses = new HashSet<Address>();          
    }

    public virtual ISet<Address> Addresses { get ; private set; }

    public Address PrimaryAddress
    {
        get { return Addresses.FirstOrDefault(a => a.IsPrimary); }
    }

    public bool AddAddress(Address address)
    {
        // insure there is only one primary address in collection
        if (address.IsPrimary)
        {                  
            if (PrimaryAddress != null)
            {
                PrimaryAddress.IsPrimary = false;
            }
        }
        else
        {
            // make sure the only address in collection is primary
            if (!Addresses.Any())
            {
                address.IsPrimary = true;
            }
        }
        return Addresses.Add(address);
    }
}

一些注意事项(我不是100%确定这些是否是EF的“最佳实践”):

  • 地址集合是虚拟的,以允许延迟加载
  • 集合上的私有设置器禁止集合替换
  • 集合是一个ISET以确保每个联系人没有重复的地址
  • 使用AddAddress方法,我可以确保始终且最多有一个主地址....

我希望(如果可能)阻止通过ContactinFO.Addresses.Add()方法添加地址,并强制使用ContactinFO.AddAddress(Address Address)...

我正在考虑通过readonlycollection公开地址集,但这在Entity Framework(v5)中是否适用?

我该怎么做呢?

共有1个答案

计和顺
2023-03-14

一种方法是保护ICollection属性,并创建一个仅返回ICollection属性列表的IEnumerable新属性。

这样做的缺点是,您无法通过ContactInfo查询地址,就像获取居住在这个城市的所有ContactInfo一样。

这是不可能的!:

from c in ContactInfos 
where c.Addresses.Contains(x => x.City == "New York") 
select c

代码:

public class ContactInfo : Entity<int>
{
    public ContactInfo()
    {
        Addresses = new HashSet<Address>();          
    }

    protected virtual ISet<Address> AddressesCollection { get ; private set; }

    public IEnumerable<Address> Addresses { get { return AddressesCollection; }}

    public Address PrimaryAddress
    {
        get { return Addresses.FirstOrDefault(a => a.IsPrimary); }
    }

    public bool AddAddress(Address address)
    {
        // insure there is only one primary address in collection
        if (address.IsPrimary)
        {                  
            if (PrimaryAddress != null)
            {
                PrimaryAddress.IsPrimary = false;
            }
        }
        else
        {
            // make sure the only address in collection is primary
            if (!Addresses.Any())
            {
                address.IsPrimary = true;
            }
        }
        return Addresses.Add(address);
    }
}
 类似资料:
  • 我的问题是关于创建实体集合的。我知道“如何嵌入收集表单”,并成功地使用了它。但在这种情况下,我有: 简单类 文体词典 我不需要为DicStyle对象创建表单,因为这是只读对象=字典(不可更改)。所以,我想创建一个类似这样的表单: 当然是伪代码。我无法想象如何实施它。 结果 假设我有: 表“Thing”有一行(id=1)。 在表单中,我为这个东西选择了两个DicStyle(id=3,id=5)。因此

  • 实体框架5.0首先使用现有数据库编写代码。使用电动工具对类进行逆向工程。一切都很好。数据库有两个表。一个父母和一个孩子的外键返回到父母ID。ID都是带有自动增量的int。我添加了许多父母记录,现在想将孩子记录添加到特定的父母。我能看到的唯一方法是通过在父母表中搜索名称或其他属性并返回ID来找到适当的父母ID。然后在添加孩子时在外键属性中使用该ID。我不想设置新父母,所以这是将孩子添加到现有父母的唯

  • 问题内容: 我需要在每个用户已经有一个ID作为键的数据库中存储大量用户数据。但是,这些用户全部来自更大的用户池,因此,该ID不会增加并且无法自动生成。我需要能够手动设置ID。 是否有捷径可寻? 问题答案: 我进行了一些测试,这似乎对我在EF 7.0.0 rc1-final上有效: 我的测试代码: (完整的程序代码在这里:http : //pastebin.com/hSs9HZCP) 它可以正确插入

  • 如何模拟AsNoTracking方法? 在下面的示例中,DbContext已经注入到服务类中,如果我从GetOrderedProducts方法中移除AsNoTracking扩展方法,它可以正常工作,但是with AsNoTracking测试失败,因为它返回null。我还试图模拟AsNoTracking以返回正确的值,但它不起作用。

  • 问题内容: 使用JPA将实体设为只读的正确方法是什么?我希望我的数据库表永远不会以编程方式进行修改。 我想我知道我应该用锁定我的对象。从数据库检索后,是否可以使用注释使我的实体直接锁定?还是我必须弄乱并覆盖该特定实体的通用DAO? 问题答案: 一种解决方案是使用基于字段的注释,将字段声明为,并仅建议公共获取者。这样做,您的对象无法更改。 (此解决方案不是特定于实体的,它只是构建不可变对象的一种方法

  • 问题内容: 我尝试通过使用实体框架连接MySql数据库,但Visual Studio不想生成* .edmx? 我在db中有1个表, -选择ado.net edm,- 选择从数据库生成 -选择 db-在这里我认为我应该选择表,但是 向导关闭 我尝试使用其他版本的EF,但是仍然无法正常工作。问题是什么? 我的软件: -Windows 7 * 64 -vs 2017社区 -mySql 8.0社区 问题答