Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EntityCollection-ICollection<;接口实体>;-运行时问题/怪癖 背景信息_C#_Entity Framework_Interface_Entity Framework 6_T4 - Fatal编程技术网

C# EntityCollection-ICollection<;接口实体>;-运行时问题/怪癖 背景信息

C# EntityCollection-ICollection<;接口实体>;-运行时问题/怪癖 背景信息,c#,entity-framework,interface,entity-framework-6,t4,C#,Entity Framework,Interface,Entity Framework 6,T4,我使用的是数据库优先的方法 我创建了一个TextTemplate(.tt)文件,该文件从EDMX文件生成接口,同时,我修改了EDMX文件(项目项)包含/生成的原始TextTemplate文件,以使生成的类实现这些接口 [人](部分公开课) 我遇到/看到的问题似乎与EntityFramework的更改跟踪功能有关。然而,它实际上源于EntityFramework本身中的异步操作 如果我调试并逐步执行上述方法,不会出现异常,,并且数据库/表会正确更新 如果在声明queryPerson.的语句之前没有

我使用的是数据库优先的方法

我创建了一个TextTemplate(.tt)文件,该文件从EDMX文件生成接口,同时,我修改了EDMX文件(项目项)包含/生成的原始TextTemplate文件,以使生成的类实现这些接口

[人](部分公开课) 我遇到/看到的问题似乎与EntityFramework的更改跟踪功能有关。然而,它实际上源于EntityFramework本身中的异步操作

如果我调试并逐步执行上述方法,不会出现异常,,并且数据库/表会正确更新


如果在声明queryPerson.的语句之前没有捕获调试点就运行它。。它将抛出异常(关于Person.CrewMembers必须是
ICollection
)的误导性异常)

这显然是一个时间问题


尝试的解决方法/关注点 我试图删除ICollection属性上的虚拟属性;没有影响这个问题

我试图删除延迟加载;没有影响这个问题

我试图提交查询之间的更改;没有影响这个问题

我试图在查询中使用
FirstAsync
;但我不确定我是否正确使用了它。。我仍然在摆弄这种方法


*编辑/更新-(误导性)异常、堆栈跟踪和目标站点
System.Data.Entity.Core.EntityException
{“System.Data.entity.DynamicProxies.Person类型的实体上的导航属性'CrewMembers'必须实现ICollection,以便实体框架能够跟踪集合中的更改。”}
资料来源:EntityFramework
位于System.Data.Entity.Core.Objects.DataClasses.EntityCollection`1.CheckIfNavigationPropertyContainentity(IEntityWrapper包装器)
在System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.Add(IentityRapper wrappedTarget、Boolean applyConstraints、Boolean AddRelationshipAsunched、Boolean relationshipAlreadyExists、Boolean AllowModifyingTheEndorRelationship、Boolean ForeignKeyChanges)
位于System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.Add(IEntityWrapper包装属性,布尔applyConstraints)
位于System.Data.Entity.Core.Objects.DataClasses.EntityReference`1.set\u ReferenceValue(IEntityWrapper值)
位于System.Data.Entity.Core.Objects.DataClasses.EntityReference.SetEntityKey(EntityKey值,布尔forceFixup)
位于System.Data.Entity.Core.Objects.EntityEntry.FixupEntityReferenceToPrincipal(EntityReference relatedEnd、EntityKey foreignKey、Boolean setIsLoaded、Boolean replaceExistingRef)
位于System.Data.Entity.Core.Objects.EntityEntry.FixupReferencesByForeignKeys(布尔替换AddRefs,EntitySetBase restrictTo)
位于System.Data.Entity.Core.Objects.ObjectStateManager.FixupReferencesByForeignKeys(EntityEntry newEntry,Boolean ReplaceAddRefs)
位于System.Data.Entity.Core.Objects.ObjectStateManager.AddEntry(EntityWrapper wrappedObject、EntityKey passedKey、EntitySet EntitySet、String argumentName、Boolean isAdded)
位于System.Data.Entity.Core.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 ConstructionEntityDelegate,EntityKey EntityKey,EntitySet EntitySet)
lambda_法(闭合、整形器)
在System.Data.Entity.Core.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper-Shaper)
位于System.Data.Entity.Core.Common.Internal.Materialization.Shaper`1.SimpleNumerator.MoveNext()
位于System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
位于System.Collections.Generic.List`1..ctor(IEnumerable`1集合)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
在c:\Users\brett.caswell\Documents\Visual Studio 2012\Projects\TestSolution\TestSolution.Infrastructure.Service.CrewMemberService.UpdateCrewMemberModel(CrewMemberModel CrewMember)中的TestSolution
TargetSite:{Boolean CheckIfNavigationPropertyContainentity(System.Data.Entity.Core.Objects.Internal.IEntityWrapper)}

*编辑/更新-问题 虽然问这个问题可能不恰当地界定了我的问题范围


在生成的类的导航属性中使用ICollection的泛型类型接口时,如何处理EntityFramework中/从EntityFramework中发生的潜在不安全线程实例(在我的
UpdateCrewmMemberModel
方法中)

如果试图使用接口作为实体(EF不支持),通常会出现此错误。船员真的是一个接口吗

如果它不是一个接口,但它是一个从接口派生的类,那么EF可能会在某个时候感到困惑。您是否正在进行流畅的配置?可能您正试图映射到将抛出此错误的基类或接口


您的代码实际上有点混乱,因为您应该使用“工作单元”,但您直接访问dbcontext,因此有效地绕过UoW,然后在UoW上调用Commit()。。。我建议您可能需要在这里重新考虑您的数据设计,并可能完全摆脱UoW,因为EF已经是一个工作单元。

这非常冗长,我似乎无法解析问题。你的问题是什么?你的权利,这看起来更像是一个可能的错误审查,而不是一个问题。。但我的问题确实符合我的意图;在处理EntityFramework中发生的潜在不安全线程实例时,如何将泛型类型接口与导航属性中的ICollection一起使用。“有关Person.CrewMembers的误导性异常必须是
ICollection
”--请您将获得的确切异常包括在内,和堆栈跟踪一起?即使它没有指向
namespace TestSolution.Domain.Entities
{
  using System;
  using System.Collections.Generic;
  using TestSolution.Domain.Entities;

  public partial class Person : IPerson
  {
    public Person()
    {
        //this.CrewMembers = new HastSet<CrewMember>();
        this.CrewMembers = new HashSet<ICrewMember>();
    }

    public Person(IPerson iPerson)
        {
        this.PersonID = iPerson.PersonID;
        this.First = iPerson.First;
        this.Last = iPerson.Last;
        //this.CrewMembers = new HastSet<CrewMember>();
        this.CrewMembers = new HashSet<ICrewMember>();
    }
    public int PersonID { get; set; }
    public string First { get; set; }
    public string Last { get; set; }

    //public virtual ICollection<CrewMember> CrewMembers { get; set; }
    public virtual ICollection<ICrewMember> CrewMembers { get; set; }
  }
}
namespace TestSolution.Domain.Entities
{
    using System;
    using System.Collections.Generic;       

    public interface IPerson
    {       
         int PersonID { get; set; }
         string First { get; set; }
         string Last { get; set; }

         //ICollection<CrewMember> CrewMembers { get; set; }
         ICollection<ICrewMember> CrewMembers { get; set; }
    }
}
public void UpdateCrewMemberModel(CrewMemberModel CrewMember)
    {
        var query = (from crewMember in UnitOfWork.DataContext.CrewMembers
                     where crewMember.CrewMemberID == CrewMember.CrewMemberID
                     select crewMember).First<CrewMember>();
        query.IsAssigned = CrewMember.IsAssigned;
        query.IsCaptain = CrewMember.IsCaptain;


        // Exception is thrown here 
        var queryPerson = (from person in UnitOfWork.DataContext.People
                           where person.PersonID == query.PersonID
                           select person).First<Person>();
        queryPerson.First = CrewMember.Person.First;
        queryPerson.Last = CrewMember.Person.Last;

        //Note that UnitOfWork uses a Factory Repository Pattern;
        //Commit just calls on UnitOfWork.DataContext.SaveAll() Method
        UnitOfWork.Commit();
    }
System.Data.Entity.Core.EntityException
{"The navigation property 'CrewMembers' on entity of type 'System.Data.Entity.DynamicProxies.Person_1A1EF42B1FC8D2DD0084F803201DE1DE4CF6E704C5AE129D954BD5BEAB55826C' must implement ICollection<T> in order for Entity Framework to be able to track changes in collections."}

Source: EntityFramework

at System.Data.Entity.Core.Objects.DataClasses.EntityCollection`1.CheckIfNavigationPropertyContainsEntity(IEntityWrapper wrapper)
at System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.Add(IEntityWrapper wrappedTarget, Boolean applyConstraints, Boolean addRelationshipAsUnchanged, Boolean relationshipAlreadyExists, Boolean allowModifyingOtherEndOfRelationship, Boolean forceForeignKeyChanges)
at System.Data.Entity.Core.Objects.DataClasses.RelatedEnd.Add(IEntityWrapper wrappedEntity, Boolean applyConstraints)
at System.Data.Entity.Core.Objects.DataClasses.EntityReference`1.set_ReferenceValue(IEntityWrapper value)
at System.Data.Entity.Core.Objects.DataClasses.EntityReference.SetEntityKey(EntityKey value, Boolean forceFixup)
at System.Data.Entity.Core.Objects.EntityEntry.FixupEntityReferenceToPrincipal(EntityReference relatedEnd, EntityKey foreignKey, Boolean setIsLoaded, Boolean replaceExistingRef)
at System.Data.Entity.Core.Objects.EntityEntry.FixupReferencesByForeignKeys(Boolean replaceAddedRefs, EntitySetBase restrictTo)
at System.Data.Entity.Core.Objects.ObjectStateManager.FixupReferencesByForeignKeys(EntityEntry newEntry, Boolean replaceAddedRefs)
at System.Data.Entity.Core.Objects.ObjectStateManager.AddEntry(IEntityWrapper wrappedObject, EntityKey passedKey, EntitySet entitySet, String argumentName, Boolean isAdded)
at System.Data.Entity.Core.Common.Internal.Materialization.Shaper.HandleEntityAppendOnly[TEntity](Func`2 constructEntityDelegate, EntityKey entityKey, EntitySet entitySet)
at lambda_method(Closure , Shaper )
at System.Data.Entity.Core.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
at System.Data.Entity.Core.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()
at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at TestSolution.Infrastructure.Service.CrewMemberService.UpdateCrewMemberModel(CrewMemberModel CrewMember) in c:\Users\brett.caswell\Documents\Visual Studio 2012\Projects\TestSolution\TestSolution.Infrastructure.Service\Services\CrewMemberServices.cs:line 67

TargetSite: {Boolean CheckIfNavigationPropertyContainsEntity(System.Data.Entity.Core.Objects.Internal.IEntityWrapper)}