3

我正在使用实体框架对现有数据库进行建模。其中一个数据库表包含与表同名的列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(预发行版)。

4

3 回答 3

5

正如我在上面的评论中猜到的,将列名更改为以小写“a”开头

...HasColumnName("anonymousUID");

希望这是一个预发布缺陷,并在 RTM 中得到修复;-)

于 2013-03-08T14:13:58.820 回答
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();
        }
    }

创建了这个数据库:

在此处输入图像描述

它能够创建、插入并显示表的计数。

于 2013-03-08T14:20:32.383 回答
0

我有一个类似的问题,但我无法重命名该列,因为它会破坏遗留代码。Power Tools 生成的类型名称都是小写的。我改变了冲突类型的大小写,它起作用了。

我怀疑 CodeFirstDatabaseSchema 正在维护小写的属性名称,但我不确定。我所知道的是,将我的小写类型名称更改为正确大写的类型名称可以修复它。我希望这对某人有帮助。

于 2013-06-02T02:22:05.180 回答