ModelValidationException:名称'AnonymousUID'不能用于'CodeFirstDatabaseSchema.AnonymousUID'类型

时间:2013-03-08 14:04:30

标签: c# .net entity-framework orm

我正在使用 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(预发行版)。

3 个答案:

答案 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();
        }
    }

创建此数据库:

enter image description here

它能够创建,插入,然后显示表的计数。

答案 2 :(得分:0)

我有类似的问题,但我无法重命名该列,因为它会破坏遗留代码。 Power Tools生成的类型名称均为小写。我改变了冲突类型的大小写,并且有效。

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