Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.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# EF6抱怨未使用的模型没有密钥_C#_Asp.net Mvc_Entity Framework - Fatal编程技术网

C# EF6抱怨未使用的模型没有密钥

C# EF6抱怨未使用的模型没有密钥,c#,asp.net-mvc,entity-framework,C#,Asp.net Mvc,Entity Framework,我只是花了一些时间解决了这个最奇怪的错误,但我不知道为什么会发生。也许有人可以跟上来解释一下为什么 tl;dr:轻量级MembershipContext由于某些完全不相关的对象没有和ID字段而失败,但只有在MVC下运行时才会这样做:所有确保这些内容正常工作的集成测试。。。它们工作正常 我所拥有的: 我有很多项目的解决方案。有关的建议包括: 域(包含用于业务对象/行为的POCO) Data(包含带有FluentAPI配置的EF6内容,并引用LPA.Domain) Web(包含一个MVC项目、re

我只是花了一些时间解决了这个最奇怪的错误,但我不知道为什么会发生。也许有人可以跟上来解释一下为什么

tl;dr:轻量级MembershipContext由于某些完全不相关的对象没有和ID字段而失败,但只有在MVC下运行时才会这样做:所有确保这些内容正常工作的集成测试。。。它们工作正常

我所拥有的:

我有很多项目的解决方案。有关的建议包括:

  • 域(包含用于业务对象/行为的POCO)
  • Data(包含带有FluentAPI配置的EF6内容,并引用LPA.Domain)
  • Web(包含一个MVC项目、refs数据和域)
这是一个非常正常的设置为我们和项目已经在开发一段时间没有问题

在数据项目中,我使用了两个DBContext。其中,
MembershipContext
仅在登录期间使用,并绕过基于用户的审核系统来验证用户。
MembershipContext
只有三个实体:User、UserMembershipDetail和UserRole

第二个,
CoreContext
具有所有正常内容(包括出于审计目的跟踪当前登录的用户ID)。这有许多实体

我所做的:

现在让我们假设我花了几天时间做一些领域级的开发。我添加了一些类,设置了它们的db对应项,构建了模型(在
CoreContext
中,
MembershipContext
不会改变),为模型编写了集成测试,并为域工作编写了单元测试。一切都很好。我根本没碰过
MembershipContext

我所做的部分工作是向
LPA.Domain
添加一个新类来处理一个名为Matter(legal Matter)的对象。这是为了模拟我在其他地方需要的一个方法,但还没有在db中设置。我在适当的实体上添加了一个
Ignore()
,稍后将充实它。没什么大不了的,对吧?所有这些仍然发生在
CoreContext

发生了什么:

我完成了几天的域级开发,然后启动LPA.Web项目,在尝试登录时遇到了一个奇怪的错误。一些四处挖掘的人基本上告诉我:

当试图从
MembershipContext
中的
Users
获取时,它会抛出一个异常,指出
LPA.Data.Matter
EntityType没有键

关于这一点,有几点令人困惑:

  • LPA.Data.Matter
    不是一个对象。
    Matter
    对象位于
    LPA.Domain.Legal
    命名空间中。这大概是EF6内部的事情,因为它创建了自己的对象来处理事情。好吧,我可以买
  • MembershipContext
    根本不使用
    物质
    。它使用的三个对象对
    对象没有下游引用(浅或深)
  • 集成测试以构建/检索
    成员身份上下文。用户
    工作正常
    (用户是异常中的违规实体)我认为这一定表明
    LPA.Web
    项目加载
    LPA.Data.MembershipContext
    的方式与测试项目的方式不同,但这对我来说没有多大意义
  • 这个
    Matter
    对象用于域项目的测试,而
    LPA.Data.CoreContext
    测试没有问题,为什么它在成员资格上失败,并且仅在通过MVC项目使用它时失败
  • 我是如何修复的:

    如前所述,我添加了
    Matter
    类作为域的快速助手,但尚未充实存储内容。因此,我在对象上没有ID字段。解决方法非常简单,只需添加一个ID字段

    这解决了问题,但无论如何也不能帮助我理解出了什么问题

    值得一提的是,在MVC项目中,我们使用了基于
    ExtendedMembershipProvider
    的自定义用户和角色提供程序,该提供程序使用自定义存储库(该存储库反过来使用
    MembershipContext
    )。在测试和MVC项目之间,
    MembershipContext
    的实例化是相同的。我无法想象他们为什么会采取不同的行动

    这就好像MVC项目中有什么东西迫使EF6读取/验证域类中的每个对象,以确保它们对不存在的数据模型的有效性

    有人知道为什么会这样吗?我自己也很困惑