为什么Entity Framework Dll中有TableAttribute?

4

为什么Table属性(用于将POCO类映射到正确的数据库名称/模式)在EntityFramework.dll中?是否有充分的理由?

这难道不会阻止你创建一个只包含实体而没有特定数据访问技术依赖的域项目吗?例如,如果我使用此属性,我不认为这些类可以移植到Silverlight。

这是一个疏忽,还是我遗漏了什么?

我知道我可以使用流畅API来规避这个问题,但是这个属性似乎更适合此目的。

2个回答

2
我认为是因为在EF 4.1中添加了TableAttribute。它属于命名空间System.ComponentModel.DataAnnotations,如果EF 4.1是.NET Framework的一部分,则可能已添加到System.ComponentModel.DataAnnotations.dll程序集中。但是,由于EF 4.1是独立于Framework更新发布的,因此他们无法触及框架核心程序集。因此,它现在位于EntityFramework.dll中,但仍位于System.ComponentModel.DataAnnotations命名空间中,因此与Entity Framework有所独立。也许它将在下一个.NET Framework版本中移动到System.ComponentModel.DataAnnotations.dll中。
目前,如果您想使用TableAttribute装饰您的POCOs,则必须引用EntityFramework.dll。只要您在自定义程序集中不使用“真正的”EF内容(DbContext等),我不认为这是对Entity Framework的依赖。

是的,我也怀疑会出现这样的情况。在完整的 .Net 平台上并不是什么大问题,但它确实会创建一个 dll 依赖项,在 Silverlight 中,我认为这将是一个问题,因为您将无法引用 EntityFramework.dll。 - user169867
它在.NET 4.0的System.ComponentModel.DataAnnotations.dll中,但那也没什么用。它不受SQL CLR支持!如果我尝试将其部署为安全程序集,则会抱怨“CREATE ASSEMBLY失败,因为安全程序集'System.ComponentModel.DataAnnotations'中的类型'System.ComponentModel.DataAnnotations.DataTypeAttribute'具有静态字段'_dataTypeStrings'。安全程序集中静态字段的属性必须在Visual C#中标记为readonly,在Visual Basic中标记为ReadOnly,在Visual C++和中间语言中标记为initonly。(Microsoft SQL Server,错误:6211)”。 - Triynko

1

这确实会对Silverlight造成问题。

对于那些遇到困难的人,目前必须使用流畅的API来进行映射。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<BankAccount>().ToTable("BankAccounts");
    modelBuilder.Entity<CreditCard>().ToTable("CreditCards");
}

HTH.


1
这是一个非常好的解决方案,既适用于原始问题,也适用于Silverlight问题,可以添加各种属性,例如Entity<BankAccount>().Property(b=>b.Id).HasDatabaseGeneratedOption(DatabaseGeneratedOption.None)。只需在标记实体后不要忘记调用base.OnModelCreating(modelBuilder)。 - James McLachlan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接