1

我发现的EF5 Table Per Type示例,例如这个使用[Table("tablename")]属性将类标记为定义表。

当我添加此属性时,我收到错误:

Error   1   The type or namespace name 'TableAttribute' could not be found (are you missing a using directive or an assembly reference?)    E:\EShared\Syrius6\syrius_syrius\SBD.Syrius.DomainClasses\Classes.cs    599 6   DomainClasses
Error   2   The type or namespace name 'TableAttribute' could not be found (are you missing a using directive or an assembly reference?)    E:\EShared\Syrius6\syrius_syrius\SBD.Syrius.DomainClasses\Classes.cs    599 6   DomainClasses

我有线

 using System.ComponentModel.DataAnnotations;

在我的命名空间中

我正在使用框架 4,因为我希望应用程序在 Windows XP 上运行。

[更新] 我在这里查看了标记为可能重复的链接,因此添加了对 System.Data.Linq 的引用和 using System.Data.Linq

错误消息现在是

 Error  1   The type or namespace name 'TableAttribute' could not be found (are you missing a using directive or an assembly reference?)    E:\EShared\Syrius6\syrius_syrius\SBD.Syrius.DomainClasses\Classes.cs    599 6   DomainClasses
Error   2   Using the generic type 'System.Data.Linq.Table<TEntity>' requires 1 type arguments  E:\EShared\Syrius6\syrius_syrius\SBD.Syrius.DomainClasses\Classes.cs    599 6   DomainClasses

重要的是,我希望我的代码在 Windows XP 上运行,并且可能重复的第二个答案需要框架 4.5

【更新】代码如下;

namespace SBD.Syrius.DomainClasses
{
 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.ComponentModel.DataAnnotations;
 using System.Data.Linq;

 [Table("Product")]
 public class Product : LoggedEntity
 { 
    [Required]
    public string BuyUnitMeasure { get; set; }
    [Required]
    public Decimal BuyUnitQuantity { get; set; }
    [Required]
    public String Code { get; set; }
    [Required]
    public string Name { get; set; }
    [Required]
    public String SellUnitMeasure { get; set; }
    [Required]
    public Decimal SellUnitQuantity { get; set; }

    public virtual Template Template { get; set; }
    [Required]
    public string UnitMeasure { get; set; }


    public override string ToString()
    {
        return !string.IsNullOrEmpty(this.Name) ? this.Name : "Products";
    }

}

 public abstract class LoggedEntity
{
    public int Id { get; set; }
    public Guid RowId { get; set; }

    [ConcurrencyCheck]
    public int RowVersionId { get; set; }

    public int SourceSiteNumber { get; set; }

 }
}

[更新]

我更正了使用 System.Data.Linq.Mapping;

现在我的错误是

 System.Data.Linq.Mapping.TableAttribute' does not contain a constructor that takes 1 arguments  

[更新]

我还查看了建议的重复问题的不被接受的答案。这是使用 System.ComponentModel.DataAnnotations 但这需要框架 4.5,我认为我不能使用它,因为它不会在 Windows XP 上运行,我需要在 XP 上运行。

[更新] 这是管理 Nuget 包中的屏幕

这是我项目中的参考

我正在 Windows 7 上开发,但应用程序需要在 XP 上运行。我看到了我试图遵循的示例 这里再次 使用 Framework 4.1 Fluent

我的问题是我可以在 EF5 上使用 TPT 在 Windows XP 上运行吗?如果是这样,怎么做?

4

2 回答 2

4

您尝试使用的类是 Entity Framework 5 的新类。您不能在 XP 上使用 Entity Framework 5,因为它需要 .NET 4.5。您收到错误的原因是 NuGet 可能下载了 Entity Framework 4.4。

从 .NET 4.0 项目从 NuGet 下载属性时的外观

在此处输入图像描述

从 .NET 4.5 项目从 NuGet 下载属性时的外观

在此处输入图像描述

你唯一的两个选择是

  1. 不要使用TableAttribute
  2. 不支持XP
于 2013-07-31T22:04:21.437 回答
4

首先,删除System.Data.Linq命名空间,不要TableAttribute从那里使用。它适用于 LINQ-to-SQL,而不适用于实体框架。

在 Entity Framework 4.1 和 5.0 版本之间,属性(以及其他)在命名空间Table程序集之间移动了一点:

根据版本,您可以在以下位置找到属性:

Entity Framework 4.1 到 4.3 和目标框架 .NET 4.0

  • EntityFramework.dll向您的项目添加对程序集的引用
  • 添加using System.ComponentModel.DataAnnotations;到代码文件

Entity Framework 5.0 和目标框架 .NET 4.0(这种组合也称为 Entity Framework 4.4)

  • EntityFramework.dll向您的项目添加对程序集的引用
  • 添加using System.ComponentModel.DataAnnotations.Schema;到代码文件

实体框架 5.0 和目标框架 .NET 4.5

  • System.ComponentModel.DataAnnotations.dll向您的项目添加对程序集的引用
  • 添加using System.ComponentModel.DataAnnotations.Schema;到代码文件

TableAttribute所有版本中都保留了它的旧目的和含义。特别是它是用于 TPT 的正确方法。

在您想要支持 Windows XP 但使用 EF 5.0 的情况下,您需要 .NET 4.0 作为目标框架。要获得正确的信息TableAttribute,您必须执行以下操作:

  • 向您的项目添加对EntityFramework.dll程序集的引用(很可能您已经拥有)
  • 检查此 DLL(鼠标右键 -> 属性)的版本号是否为 4.4。如果您在项目面向 .NET 4.5 时下载了 Nuget 包,则您可能拥有错误的版本 (5.0)。后来您将框架更改为 .NET 4.0。在这种情况下,删除对当前的引用并在解决方案文件夹下的路径中EntityFramework.dll添加对程序集的引用EntityFramework.dllpackages\EntityFramework.5.0.0\lib\net40
  • 添加using System.ComponentModel.DataAnnotations.Schema;到代码文件

从这三点中的最后一点开始,也许这是您必须附加.Schemausing指令的唯一问题。

于 2013-07-31T23:33:09.720 回答