我找到的 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上运行。
[更新]
我在Windows 7上开发但应用程序需要在XP上运行。 我看到了我想要遵循的例子 Here it is again使用Framework 4.1 Fluent
我的问题是我可以在EF5上使用TPT在Windows XP上运行吗? 如果是这样,怎么样?
答案 0 :(得分:4)
您尝试使用的课程is new to Entity Framework 5。您不能在XP上使用Entity Framework 5,因为它需要.NET 4.5。您收到错误的原因是NuGet可能下载了Entity Framework 4.4。
从.NET 4.0项目中从NuGet下载属性时的属性
从.NET 4.5项目中从NuGet下载属性时的属性
你唯一的两个选择是
TableAttribute
答案 1 :(得分:4)
首先,删除System.Data.Linq
命名空间,不要使用TableAttribute
。它适用于LINQ-to-SQL而不适用于Entity Framework。
在Entity Framework的4.1和5.0版本之间,Table
属性(以及其他属性)在命名空间和程序集之间移动了一点:
根据版本的不同,您可以在以下位置找到该属性:
EntityFramework.dll
程序集的引用添加到您的项目using System.ComponentModel.DataAnnotations;
添加到代码文件EntityFramework.dll
程序集的引用添加到您的项目using System.ComponentModel.DataAnnotations.Schema;
添加到代码文件System.ComponentModel.DataAnnotations.dll
程序集的引用添加到您的项目using System.ComponentModel.DataAnnotations.Schema;
添加到代码文件 TableAttribute
在所有版本中保留了旧的目的和意义。特别是它是用于TPT的正确选择。
在您希望支持Windows XP但使用EF 5.0的情况下,您需要将.NET 4.0作为目标框架。要获得正确的TableAttribute
,您必须这样做:
EntityFramework.dll
程序集的引用添加到您的项目中(很可能已经有了)EntityFramework.dll
的引用,并在解决方案文件夹下的路径EntityFramework.dll
中添加对packages\EntityFramework.5.0.0\lib\net40
程序集的引用using System.ComponentModel.DataAnnotations.Schema;
添加到代码文件从这三点中的最后一点开始,也许这是你唯一的问题,你必须将.Schema
附加到using
指令。