【发布时间】:2016-03-05 02:45:08
【问题描述】:
我有一个地址集合,其中可以包含一个客户的多个地址(交货、发票等)
现在,我尝试在我的 Customer 类中使用 .Include(s => s.Addresses)。地址和派生的 DeliveryAddress 定义如下:
protected virtual ICollection<Address> Addresses
{
get { return _addresses ?? (_addresses = new Collection<Address>()); }
set { _addresses = value; }
}
[NotMapped]
public Address DeliveryAddress
{
get { return GetAddress(AddressType.Delivery); }
}
private Address GetAddress(AddressType type)
{
return Addresses.FirstOrDefault(a => a.Type == type);
}
由于它是受保护的财产,我在 Mapping but not exposing ICollections in Entity Framework 上找到了解决方案
我还找到了以下帖子,但这是关于映射而不是包含: How to map a protected property in EF 4.3 code first
在这里,他们将以下内容添加到包含受保护属性 public static Expression<Func<Parent, ICollection<Child>>> ChildrenAccessor = f => f.ChildrenStorage; 的类中。
所以我在我的 Customer 类中添加了相同的内容,如下所示:
public static Expression<Func<Customer, ICollection<Address>>> AddressesAccessor = f => f.Addresses;
然后我可以使用包含 Include(Customer.AddressesAccessor)
这对映射很有用,但我没有让它与 Include 方法一起使用。它不断告诉我以下内容:
System.InvalidOperationException:指定的包含路径无效。 EntityType 'Web.DataAccess.Customer' 未声明名为 'Addresses' 的导航属性。
当我将 Addresses 属性的签名从 protected 更改回 public 时,一切正常。
有谁知道如何使这项工作适用于受保护的收藏?
【问题讨论】:
-
看起来你需要它是
public。那么为什么要将其设置为protected?将其保留为public有什么问题,因为您希望其他类能够访问该属性? -
收藏品已经存在于客户身上。我想添加一些额外的
publicproperties 按类型公开地址,而不是一直对集合进行 linq 查询。有了这些额外的public属性,集合就不再需要public。
标签: entity-framework entity-framework-6