【问题标题】:"Entity does not have a key defined" error in working production code工作生产代码中的“实体没有定义键”错误
【发布时间】:2013-07-22 08:33:52
【问题描述】:

我们遇到了一个非常奇怪的问题:我们正在为 IIS 6.1 中托管的 silverlight 5 应用程序使用实体框架 4 和 ria 服务。在很长一段时间内,一切都运行顺利,但有时应用程序会失败并在事件日志中显示以下错误消息:

WebHost 未能处理请求。
发件人信息: System.ServiceModel.Activation.HostedHttpRequestAsyncResult/56703158
异常:System.ServiceModel.ServiceActivationException:服务 '/Services/EcoFleet-DomainServices-Repository-EcofleetRepository.svc' 编译时出现异常,无法激活。
异常消息是:DomainService 中的实体“DeviceData” 'EcofleetRepository' 没有定义键。暴露的实体类型 通过 DomainService 操作必须至少有一个公共属性 标有 KeyAttribute.. ---> System.InvalidOperationException: DomainService 'EcofleetRepository' 中的实体 'DeviceData' 没有 定义了一个键。 DomainService 操作公开的实体类型 必须至少有一个公共财产标有 KeyAttribute.
在 System.ServiceModel.DomainServices.Server.DomainServiceDescription.ValidateEntityTypes()
在 System.ServiceModel.DomainServices.Server.DomainServiceDescription.Initialize()
在 System.ServiceModel.DomainServices.Server.DomainServiceDescription.CreateDescription(类型 domainServiceType)
在 System.Collections.Concurrent.ConcurrentDictionary2.GetOrAdd(TKey key, Func2 valueFactory)
at System.ServiceModel.DomainServices.Server.DomainServiceDescription.GetDescription(类型 domainServiceType)
在 System.ServiceModel.DomainServices.Hosting.DomainServiceHost..ctor(类型 domainServiceType, Uri[] baseAddresses)
在 System.ServiceModel.DomainServices.Hosting.DomainServiceHostFactory.CreateServiceHost(类型 serviceType, Uri[] baseAddresses)
在 System.ServiceModel.Activation.ServiceHostFactory.CreateServiceHost(字符串 构造函数字符串,Uri[] baseAddresses)
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.CreateService(字符串 normalizedVirtualPath, EventTraceActivity eventTraceActivity)
at System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService(ServiceActivationInfo serviceActivationInfo, EventTraceActivity eventTraceActivity)

在 System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(字符串 normalizedVirtualPath, EventTraceActivity eventTraceActivity)

--- 内部异常堆栈跟踪结束 ---
System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult 结果)
在 System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult 结果)进程名称:w3wp
进程ID:2300

应用程序仍然响应,但无法从服务器加载任何实体。停止并启动站点后,一切都恢复正常。

本例中的实体(DeviceData)是一个数据库表,它确实有一个键,不管哪个实体失败似乎是随机的。此外,我只希望在编译时看到“未定义键”错误。有谁知道问题是什么,以及如何解决?

【问题讨论】:

  • 我讨厌 ria 服务。但是使用它。它在编译时非常慢并且有很多限制。如果您使用代码生成器,请检查 [Key] 是否真的为项目生成。我只是很少使用t4。 EDMX 似乎更适合这类问题。
  • 它没有生成属性,但我仍然不明白为什么它会导致它只是随机中断,只是通过重新启动站点来神奇地修复自己......但是我会尝试更换发电机,看看能不能修好。
  • 你有没有找到解决这个问题的方法?我们也遇到了同样的问题。
  • @LarsP。同时我换了工作,我不记得我们是否找到了真正的解决方法,或者它只是神奇地自行修复......

标签: entity-framework silverlight iis wcf-ria-services ria


【解决方案1】:

您的DeviceData 实体没有定义键,这是必需的。您应该创建名称为 IdDeviceDataId 的属性,这将按照约定被视为键(实体框架当前查找这些属性)。您也可以使用映射将其他属性设置为键。这可以通过数据注释属性来实现:

[Key]
public int Foo { get; set; }

或者使用流畅的映射:

modelBuilder.Entity<DeviceData>().HasKey(d => d.Foo);

【讨论】:

  • 实体确实已经定义了一个键。它是对应数据库表的主键,是一个简单的int。
  • @sondergard 密钥的名称是什么?顺便说一句,你不能在编译时得到 key not defined 错误
  • public virtual int Id { get;放; }
  • 我在编译时得到了“未定义的键”,但这可能是 RIA 服务在抱怨,而不是实体框架。 RIA 服务确实需要每个实体上的密钥。
  • @sondergard 这很奇怪。即使是虚拟修饰符在这里也不重要。尝试手动放置[Key] 属性。在这种情况下 EF 会抛出错误吗?
【解决方案2】:

首先,您不会在编译时出现错误,因为它不是强制性的,但没有错误可能会让您非常头疼,因为 EF 以多种方式使用它。因此,您必须通过将其命名为 IdDeviceDataId(使用约定)来重新定义您的密钥,或者从模型中定义一个。

从您的问题看来,为 DeviceData 定义了一个键,在这种情况下,我建议您重新查看模型中键列的属性。

还请记住,没有键列可能会降低应用的性能。

【讨论】:

  • 属性并不多...它是一个到/来自一个名为 Id 的整数主键列的映射。 StoreGeneratedPattern = Identity 和 EntityKey = true。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-19
相关资源
最近更新 更多