我正在使用 Entity Framework 来建模现有数据库。其中一个数据库表包含一个与表名相同的列, AnonymousUID 。
我使用Entity Framework Power Tools函数逆向工程代码优先来生成模型类和映射。逆向工程过程自动重命名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(预发行版)。
答案 0 :(得分:5)
正如我在上面的评论中所猜测的那样,将列名更改为以小写'a'开头
...HasColumnName("anonymousUID");
我们希望这是一个预发布缺陷,并在RTM中修复; - )
答案 1 :(得分:0)
您显示的代码是您使用AnonymousUID
名称的唯一地方吗?生成的DbSet
中的DbContext
的名称是什么?
我构建了一个测试应用程序,并没有得到任何错误,完全在这里:
public partial class AnonymousUID
{
[Key]
public int UID { get; set; }
public string AnonymousUID1 { get; set; }
}
public class Model : DbContext
{
public DbSet<AnonymousUID> AnonymousUIDs { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<AnonymousUID>()
.Property(a => a.AnonymousUID1)
.HasColumnName("AnonymousUID");
modelBuilder.Entity<AnonymousUID>()
.ToTable("AnonymousUID");
}
}
class Program
{
static void Main(string[] args)
{
var model = new Model();
var a = new AnonymousUID();
a.AnonymousUID1 = "hello world";
model.AnonymousUIDs.Add(a);
model.SaveChanges();
var applications = model.AnonymousUIDs.ToList();
Console.WriteLine(applications.Count);
Console.ReadLine();
}
}
创建此数据库:
它能够创建,插入,然后显示表的计数。
答案 2 :(得分:0)
我有类似的问题,但我无法重命名该列,因为它会破坏遗留代码。 Power Tools生成的类型名称均为小写。我改变了冲突类型的大小写,并且有效。
我怀疑CodeFirstDatabaseSchema正在维护小写的属性名称,但我不确定。我所知道的是,将我的小写类型名称更改为正确大写的类型名称可以修复它。我希望这对某人有帮助。