我有许多一对多映射/枢轴表我不得不为了建模类似的关系暴露作为一个实体以下(按照这个问题模型实体框架多对多加上共享关系 ):
现在,我想效仿EF集合枚举/添加/删除功能上存在一个“存量”实体框架许多一对多的关系的导航属性。 我会怎么做呢?
我希望的东西,我还是可以查询不吹我的数据表现。 显然,仅仅实现以下弥合透视表不实现这一目标,也并不遵循EF约定管理集合:
public partial class Composition {
public IEnumerable<Anthology> Anthologies {
get {
return CompositionAnthologies.Select(e => e.Anthology);
}
}
public void AddAnthology(Anthology anthology)
{
CompositionAnthologies.Add(new CompositionAnthology() {
Anthology = anthology,
Composer = Composer
});
}
}
你能给我一个例子或推荐的起点? (注意:我使用的模型首先目前,但将切换到代码优先解决的办法,因为模型的第一似乎迅速成为二等公民。)
编辑:这是在关系和约束进一步信息。
许多一对多关系具有结合表(“CompositionAnthologies”),其包括结合ComposerId柱,用必要的手动创建的FK关系执行Composition.Composer == Anthology.Composer所有Anthology.Compositions(和Composition.Anthologies) 。 这是因为持有的结台的关系:
ieThere必须不涉及选集组合物,但具有不同作曲家。
这是我目前的解决方案。 仍然是开放的建议,因为这掩盖了IQueryable的,它具有性能后果。 它也没有背景,所以无法删除结点(注意NotImplemented例外)。 后一个问题是不是对我非常重要,因为我的数据有,我用反正删除标志。
这里的关系的一个侧面。 他们是对称的。
public partial class Composition {
public ICollection<Anthology> Anthologies {
get {
return new JunctionedAnthologies(this);
}
}
}
public class JunctionedAnthologies : ICollection<Anthology> {
private readonly Composition _parent;
public JunctionedAnthologies(Composition parent)
{
_parent = parent;
}
public void Add(Anthology item) {
if (item.Composer == null) {
if (_parent.Composer == null) throw new InvalidOperationException("The parent or child Composer must be set to form this association");
item.Composer = _parent.Composer;
}
else if (_parent.Composer == null) {
_parent.Composer = item.Composer;
}
else if (item.Composer != _parent.Composer) {
throw new InvalidOperationException("The parent and child must not have a differing Composer assigned");
}
junction.Add(new CompositionAnthology() {
Anthology = item,
Composer = item.Composer
});
}
public void Clear() {
throw new NotImplementedException();
}
public bool Contains(Anthology item) {
return junction.Any(j => j.Anthology == item);
}
public void CopyTo(Anthology[] array, int arrayIndex) {
throw new NotImplementedException();
}
public int Count {
get { return junction.Count; }
}
public bool IsReadOnly {
get { return false; }
}
public bool Remove(Anthology item) {
throw new NotImplementedException();
}
public IEnumerator<Anthology> GetEnumerator() {
return junction.Select(e => e.Anthology).GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator() {
return GetEnumerator();
}
private ICollection<CompositionAnthology> junction {
get {
return _parent.CompositionAnthologies;
}
}
}