gpt4 book ai didi

c# - 该类型不具有 EdmEntityTypeAttribute 属性,但包含在具有 EdmSchemaAttribute 属性的程序集中

转载 作者:行者123 更新时间:2023-12-01 19:56:00 28 4
gpt4 key购买 nike

我在 MVC4 应用程序的某个页面上收到此错误

The type 'Group' is not attributed with EdmEntityTypeAttribute but is 
contained in an assembly attributed with EdmSchemaAttribute. POCO
entities that do not use EdmEntityTypeAttribute cannot be contained
in the same assembly as non-POCO entities that use EdmEntityTypeAttribute.

前一分钟还工作正常,下一分钟这个错误就出现了并且不会消失。我没有更改与上下文模型相关的任何内容。如果我回滚所有其他代码更改,错误仍然存​​在。

我已经看过this post,它处理类似的错误。不过我自始至终都在使用 DbContext。该修复对我不起作用。

我尝试过重新生成类,甚至删除并重新创建 .edmx,但没有任何效果。

这是非工作类之一的部分代码

表(从 SQL Server 提升的 SQL 创建语句):

CREATE TABLE [dbo].[Groups](
[group_id] [int] IDENTITY(1,1) NOT NULL,
[user_id] [uniqueidentifier] NULL,
[parent_group_id] [int] NULL,
[group_type] [tinyint] NULL,
[group_name] [nvarchar](50) NULL,
[date_created] [smalldatetime] NULL,
[date_accessed] [smalldatetime] NULL,
[date_modified] [smalldatetime] NULL,
[date_deleted] [smalldatetime] NULL,
[n_total_contacts] [int] NULL,
[n_unsubscribed] [int] NULL,
[n_excluded] [int] NULL,
CONSTRAINT [PK_Group] PRIMARY KEY CLUSTERED
(
[group_id] ASC
)
WITH
(
PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON
)
ON [PRIMARY]
)
ON [PRIMARY]

自动生成的上下文类:

namespace MyProject
{
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Data.Objects;
using System.Data.Objects.DataClasses;
using System.Linq;

public partial class MyDbContext : DbContext
{
public MyDbContext () : base("name=MyDbContext ")
{
}

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}

public DbSet<Group> Groups { get; set; }

}
}

自动生成的 Group.cs 类:

namespace MyProject
{
using System;
using System.Collections.Generic;

public partial class Group
{
public int group_id { get; set; }
public Nullable<System.Guid> user_id { get; set; }
public Nullable<int> parent_group_id { get; set; }
public Nullable<byte> group_type { get; set; }
public string group_name { get; set; }
public Nullable<System.DateTime> date_created { get; set; }
public Nullable<System.DateTime> date_accessed { get; set; }
public Nullable<System.DateTime> date_modified { get; set; }
public Nullable<System.DateTime> date_deleted { get; set; }
public Nullable<int> n_total_contacts { get; set; }
public Nullable<int> n_unsubscribed { get; set; }
public Nullable<int> n_excluded { get; set; }
}
}

View 模型:

public class GroupsListModel
{
public List<Group> Groups { get; set; }
}

View :

public ActionResult List() 
{
GroupsListModel model = new GroupsListModel();
using (MyDbContext db = new MyDbContext())
{
model.Groups = db.Groups.ToList();
}
return View(model);
}

再次,我想补充一点,这一切在 15 分钟前都有效。我在 View 中更改了几行,这导致了此错误,当我将其改回时,错误仍然存​​在。

**更新:**

我已经接受了@Pawel 下面的回答,因为它解决了最初的问题,但我只是想分享有关完整解决方案的更多信息

在这个项目中,我连接到两台服务器,其中一台运行 Sql Server 2005,另一台运行 Sql Server 2008。删除 EdmSchemaAttribute 后,我收到一个新错误:

所有 SSDL 工件必须针对同一提供者。 ProviderManifestToken '2008' 与之前遇到的 '2005' 不同。

我在 google 上搜索并发现建议我应该编辑 2005 .edmx 文件并将 2005 更改为 2008。这导致了一个新错误:正在使用的 SQL Server 版本不支持数据类型“datetime2”

事实证明,我的 SQL Server 2008 DB 中的一个 datetime 列实际上是一个 date 列。对于其他一切,这没有什么区别,但 date 映射到 EF 中的 datetime2,这导致 2005 架构出现问题。我相信这可能是问题的根本原因。

我使用的解决方案是编辑 2008 年 .edmx 文件,将 2008 年更改为 2005 年,并将日期字段更改为日期时间。此后该项目编译并运行没有问题。

最佳答案

在 EF 支持 POCO 实体之前,它仅支持非 POCO 实体。非 POCO 实体派生自 EntityObject 类,每个实体、复杂类型、枚举类型、成员等都必须具有 EF 特定属性,否则它们将无法工作。非 POCO 实体所在的程序集必须使用 EdmSchemaAttribute 进行归因。如果程序集具有此属性,EF 就知道它包含非 POCO 属性,并且仅查找这些属性。 POCO 和非 POCO 类型不能存在于同一程序集中。在您的情况下,您似乎在项目中的某处定义了 EdmSchemaAttribute (请注意,这是一个程序集级别属性,因此它基本上可以存在于任何文件中)。如果您只想使用 POCO 类型,只需找到该属性并将其删除。如果要混合 POCO 和非 POCO 类型,则需要在与定义非 POCO 类型不同的程序集中定义 POCO 类型(不过,我不建议混合 POCO 和非 POCO 类型)。请注意,在 EF 设计器中,非 POCO 类型曾经是 VS2010 中的默认选择(基于 EntityObject 的实体和基于 ObjectContext 的上下文)。在 VS2012 附带的设计器中,默认上下文是 DbContext,但您仍然可以将代码生成策略更改为“默认”(有趣的是,创建基于 DbContext 的上下文和 POCO 实体的默认代码生成策略称为“无”)。如果您这样做,那么为模型生成的代码将添加 EdmSchemAttribute。在 VS2013(和 OOB version for VS2012 )中,如果您的目标是 EF6,您将无法选择代码生成策略(一切都是基于 T4 的 - 如果您确实需要 ObjectContext,您应该能够在 VS Gallery 上找到模板)。如果您的目标是 EF5,那么您将能够选择生成非 POCO 内容的策略,但我认为这称为 Legacy ObjectContext 之类的东西,而不是 T4,即 DbContext 和 friend 。

关于c# - 该类型不具有 EdmEntityTypeAttribute 属性,但包含在具有 EdmSchemaAttribute 属性的程序集中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19544971/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com