我可以在Windows XP上实现Entity Framework 5 TPT吗?

时间:2013-07-31 06:45:26

标签: .net entity-framework-5

我找到的 EF5 Table Per Type 示例,例如this one使用[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上运行。

[更新]我查看了标记为可能重复here的链接,结果添加了对System.Data.Linq的引用和使用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上运行。

[更新] Here is the screen in Manage Nuget Packages

Here is the reference in my project

我在Windows 7上开发但应用程序需要在XP上运行。 我看到了我想要遵循的例子 Here it is again使用Framework 4.1 Fluent

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

2 个答案:

答案 0 :(得分:4)

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

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

enter image description here

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

enter image description here

你唯一的两个选择是

  1. 请勿使用TableAttribute
  2. 不支持XP

答案 1 :(得分:4)

首先,删除System.Data.Linq命名空间,不要使用TableAttribute。它适用于LINQ-to-SQL而不适用于Entity Framework。

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

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

实体框架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;添加到代码文件

Entity Framework 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.dll中添加对packages\EntityFramework.5.0.0\lib\net40程序集的引用
  • using System.ComponentModel.DataAnnotations.Schema;添加到代码文件

从这三点中的最后一点开始,也许这是你唯一的问题,你必须将.Schema附加到using指令。