自定义实体框架许多一对多导航属性(Custom Entity Framework many-to-m

2019-10-18 02:23发布

我有许多一对多映射/枢轴表我不得不为了建模类似的关系暴露作为一个实体以下(按照这个问题模型实体框架多对多加上共享关系 ):

现在,我想效仿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必须不涉及选集组合物,但具有不同作曲家。

Answer 1:

这是我目前的解决方案。 仍然是开放的建议,因为这掩盖了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;
        }
    }
}


文章来源: Custom Entity Framework many-to-many navigation property