问题
Examples of EF5 Table Per Type that I have found, such as this one use the [Table("tablename")]
attribute to mark a class as defining a table.
When I add this attribute I get errors:
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
I have the line
using System.ComponentModel.DataAnnotations;
in my namespace
And I am using framework 4 because I want the app to run on Windows XP.
[Update] I had a look at the link flagged as a possible duplicate here, and as a consequence added a reference to System.Data.Linq and a using System.Data.Linq
The error messages are now
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
Importantly, I want my code to work on Windows XP , and the second answer to the possible duplicate requires framework 4.5
[Update] Code is as follows;
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; }
}
}
[Update]
I corrected the using to be using System.Data.Linq.Mapping;
Now my error is
System.Data.Linq.Mapping.TableAttribute' does not contain a constructor that takes 1 arguments
[Update]
I also looked at the not accepted answer to the suggested duplicate question. Which is to use System.ComponentModel.DataAnnotations however this requires framework 4.5 and I don't think I can use that because it wont run on Windows XP, and I need to run on XP.
[update]


I am developing on Windows 7 but the application needs to run on XP. I see the example I am trying to follow Here it is again uses Framework 4.1 Fluent
My question is Can I use TPT on EF5 to run on Windows XP? If so, how?
回答1:
First of all, remove the System.Data.Linq
namespace and don't use the TableAttribute
from there. It is for LINQ-to-SQL and not for Entity Framework.
Between version 4.1 and 5.0 of Entity Framework the Table
attribute (among others) has been moved around a bit between namespaces and assemblies:
Depending on the version you can find the attribute at the follwing places:
Entity Framework 4.1 to 4.3 and target framework .NET 4.0
- Add reference to
EntityFramework.dll
assembly to your project - Add
using System.ComponentModel.DataAnnotations;
to code file
Entity Framework 5.0 and target framework .NET 4.0 (This combination is also called Entity Framework 4.4)
- Add reference to
EntityFramework.dll
assembly to your project - Add
using System.ComponentModel.DataAnnotations.Schema;
to code file
Entity Framework 5.0 and target framework .NET 4.5
- Add reference to
System.ComponentModel.DataAnnotations.dll
assembly to your project - Add
using System.ComponentModel.DataAnnotations.Schema;
to code file
The TableAttribute
has kept its old purpose and meaning in all versions. Especially it's the correct one to use for TPT.
In your situation where you want to support Windows XP but use EF 5.0 you need .NET 4.0 as target framework. To get the correct TableAttribute
you have to do:
- Add reference to
EntityFramework.dll
assembly to your project (most likely you have that already) - Check if this DLL (right mouse -> Properties) has version number 4.4. You can potentially have the wrong version (5.0) if you downloaded the Nuget package while your project targetted .NET 4.5. and you changed the framework later to .NET 4.0. In that case remove the reference to the current
EntityFramework.dll
and add a reference to theEntityFramework.dll
assembly in the pathpackages\EntityFramework.5.0.0\lib\net40
under your solution folder - Add
using System.ComponentModel.DataAnnotations.Schema;
to code file
Start with the last of these three points, maybe it's your only problem that you have to append .Schema
to the using
directive.
回答2:
The class you are trying to use is new to Entity Framework 5. You can't use Entity Framework 5 on XP because it requires .NET 4.5. The reason you are getting the errors is NuGet likely downloaded Entity Framework 4.4.
What the properties look like when you download it from NuGet from a .NET 4.0 project

What the properties look like when you download it from NuGet from a .NET 4.5 project

Your only two options are
- Don't use
TableAttribute
- Don't support XP
来源:https://stackoverflow.com/questions/17963417/can-i-implement-entity-framework-5-tpt-on-windows-xp