与实体框架中的代码第一个外键发生冲突的更改

Cel*_*Cel 0 .net c# sql orm entity-framework

我使用适配器能够将接口而不是具体类型插入dbcontext.适配器可以独立工作,但是我无法将任何一对一(父子)关系保存到数据库中:

例外来源

public void SaveDomain(IDomain domain){
    _entityRepositor = new Donors();
    _entityRepositor.DomainReps.Add(new DomainRep(domain));                
}
Run Code Online (Sandbox Code Playgroud)

出现InvalidOperationException

Conflicting changes to the role 'DomainRep_TopLevelDomainRep_Target' of the relationship 'Edonics.Repositor.DomainRep_TopLevelDomainRep' have been detected.

外键属性和导航属性应该同步?

public class DomainRep: IDomain
{
    private readonly IDomain _adaptee;        


    public DomainRep(IDomain adaptee)
    {
        _adaptee = adaptee;
    }

    [NotMapped]
    public IDomain Adaptee
    {
        get { return _adaptee; }
    }

    public string Id
    {
        get { return _adaptee.Id; }
        set { _adaptee.Id = value; }
    }

    public string TopLevelDomainRepId
    {
        get { return _adaptee.Tld.Id; }

        set { }
    }

    [ForeignKey("TopLevelDomainRepId")]
    public TopLevelDomainRep TopLevelDomainRep
    {
        get { return new TopLevelDomainRep(Tld); }
        set { Tld = value.Adaptee; }
    }

    public ITopLevelDomain Tld
    {
        get { return _adaptee.Tld; }
        set { _adaptee.Tld = value; }
    }

    public string SecondLevelDomainRepId
    {
        get { return _adaptee.Sld.Id; }  

        set { } 
    }

    [ForeignKey("SecondLevelDomainRepId")]
    public SecondLevelDomainRep SecondLevelDomainRep
    {
        get { return new SecondLevelDomainRep(Sld); }
        set { Sld = value.Adaptee; }
    }

    public ISecondLevelDomain Sld
    {
        get { return _adaptee.Sld; }
        set { _adaptee.Sld = value; }
    }

}
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Era*_*nga 5

您的适配器模式会干扰EF的工作方式.您正在为实体的导航属性提供不同的实现.例如,如果TopLevelDomainRep多次访问属性,它将返回多个实例,但具有相同的ID /实体密钥.对于给定的主键值,EF仅处理每个上下文的单个实例.

您可以在EF实体之上创建域图层,也可以按照预期的方式使用EF实体.