我有一个POCO领域模型,使用新的ObjectContext类将其与实体框架连接起来。
在上面的示例中,我将Photos集合类型设置为IEnumerable,因为这样会使其只读。唯一添加/删除照片的方法是通过公共方法。
问题在于,Entity Framework无法将Photo实体加载到IEnumerable集合中,因为它不是ICollection类型。
将类型更改为ICollection将允许调用者在集合本身上调用Add方法,这并不好。
我的选择是什么?
编辑:
我可以重构代码,使其不公开Photos的公共属性:
使用GetPhotos()方法返回集合。这种方法的另一个问题是,我将失去更改跟踪功能,因为我无法将集合标记为虚拟 - 不可能将属性标记为私有虚拟。
在NHibernate中,我认为可以通过配置将代理类映射到私有集合。我希望这将成为EF4的一个特性。目前,我不喜欢无法对集合进行任何控制的情况!
public class Product
{
private ICollection<Photo> _photos;
public Product()
{
_photos = new Collection<Photo>();
}
public int Id { get; set; }
public string Name { get; set; }
public virtual IEnumerable<Photo> Photos
{
get
{
return _photos;
}
}
public void AddPhoto(Photo photo)
{
//Some biz logic
//...
_photos.Add(photo);
}
}
在上面的示例中,我将Photos集合类型设置为IEnumerable,因为这样会使其只读。唯一添加/删除照片的方法是通过公共方法。
问题在于,Entity Framework无法将Photo实体加载到IEnumerable集合中,因为它不是ICollection类型。
将类型更改为ICollection将允许调用者在集合本身上调用Add方法,这并不好。
我的选择是什么?
编辑:
我可以重构代码,使其不公开Photos的公共属性:
public class Product
{
public Product()
{
Photos = new Collection<Photo>();
}
public int Id { get; set; }
public string Name { get; set; }
private Collection<Photo> Photos {get; set; }
public IEnumerable<Photo> GetPhotos()
{
return Photos;
}
public void AddPhoto(Photo photo)
{
//Some biz logic
//...
Photos.Add(photo);
}
}
使用GetPhotos()方法返回集合。这种方法的另一个问题是,我将失去更改跟踪功能,因为我无法将集合标记为虚拟 - 不可能将属性标记为私有虚拟。
在NHibernate中,我认为可以通过配置将代理类映射到私有集合。我希望这将成为EF4的一个特性。目前,我不喜欢无法对集合进行任何控制的情况!