该类型不是使用 EdmEntityTypeAttribute 属性属性的,而是包含在使用 EdmSchemaAttrib

本文关键字:属性 EdmSchemaAttrib 包含 EdmEntityTypeAttribute 类型 | 更新日期: 2023-09-27 18:36:38

我在 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.

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

我已经看过这篇文章,它处理了一个类似的错误。但是,我始终使用DbContext。该修复程序对我不起作用。

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

下面是其中一个非工作类的部分代码

表(从 SQL 服务器提取的 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; }
    }
}

自动生成的组.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; }
    }
}

视图模型:

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

观点:

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

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

**更新:**

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

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

All SSDL artifacts must target the same provider. The ProviderManifestToken ’2008′ is different from ’2005′ that was encountered earlier.

我用谷歌搜索并找到了我应该编辑 2005 .edmx 文件并将 2005 更改为 2008 的建议。这导致了一个新错误:The version of SQL Server in use does not support datatype ‘datetime2′

事实证明,我的 SQL Server 2008 DB 中的datetime列之一实际上是date列。对于其他所有内容,这没有任何区别,但date映射到 EF 中的datetime2,这导致了 2005 架构的问题。我相信这可能是问题的根本原因。

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

该类型不是使用 EdmEntityTypeAttribute 属性属性的,而是包含在使用 EdmSchemaAttrib

在 EF 支持 POCO 实体

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