我正在使用实体框架对现有数据库进行建模。其中一个数据库表包含与表同名的列AnonymousUID。
我使用Entity Framework Power Tools功能Reverse Engineer Code First来生成模型类和映射。逆向工程过程会自动重命名AnonymousUID
类成员(为AnonymousUID1
)以避免成员名称与类名称相同。因此生成的模型类如下所示:
public partial class AnonymousUID
{
public string UID { get; set; }
public string AnonymousUID1 { get; set; }
}
并且 EF 映射构造函数是这样实现的:
public AnonymousUIDMap()
{
// Primary Key
this.HasKey(t => t.UID);
// Properties
this.Property(t => t.UID).IsRequired().HasMaxLength(64);
this.Property(t => t.AnonymousUID1).IsRequired().HasMaxLength(64);
// Table & Column Mappings
this.ToTable("AnonymousUID");
this.Property(t => t.UID).HasColumnName("UID");
this.Property(t => t.AnonymousUID1).HasColumnName("AnonymousUID");
}
数据库上下文类是这样实现的:
public partial class MyDbContext : DbContext
{
// Constructors...
public DbSet<AnonymousUID> AnonymousUIDs { get; set; }
...
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Configurations.Add(new AnonymousUIDMap());
...
}
}
这一切都很好,并且代码构建没有问题。但是当我尝试访问数据库的任意内容时:
using (var context = new MyDbContext())
{
var foos = from foo in context.Foos select foo;
...
}
尽管如此,仍会引发以下异常:
System.Data.Entity.ModelConfiguration.ModelValidationException :
One or more validation errors were detected during model generation:
\tAnonymousUID: Name: Name 'AnonymousUID' cannot be used in type
CodeFirstDatabaseSchema.AnonymousUID'. Member names cannot be the
same as their enclosing type.
显然在 中进行了一些额外的映射构建CodeFirstDatabaseSchema
,并且此过程无法避免类/成员名称冲突。
- 为什么会出现这个错误?毕竟,逆向工程程序设法规避了命名问题。
- 在不修改已建立数据库的架构的情况下,有什么方法可以避免引发此异常?
我在 .NET Framework 4 项目中使用来自 Nuget 的 Entity Framework 6.0(预发行版)。