C# ModelValidationException:Name';匿名uid';不能在类型';CodeFirstDatabaseSchema.AnonymousUID';

C# ModelValidationException:Name';匿名uid';不能在类型';CodeFirstDatabaseSchema.AnonymousUID';,c#,.net,entity-framework,orm,C#,.net,Entity Framework,Orm,我正在使用实体框架对现有数据库进行建模。其中一个数据库表包含一个与该表同名的列,即AnonymousUID 我首先使用函数反向工程代码来生成模型类和映射。反向工程过程自动重命名匿名UID类成员(到匿名UID1),以避免成员名称与类名相同。因此,生成的模型类如下所示: public partial class AnonymousUID { public string UID { get; set; } public string AnonymousUID1 { get; set;

我正在使用实体框架对现有数据库进行建模。其中一个数据库表包含一个与该表同名的列,即AnonymousUID

我首先使用函数反向工程代码来生成模型类和映射。反向工程过程自动重命名
匿名UID
类成员(到
匿名UID1
),以避免成员名称与类名相同。因此,生成的模型类如下所示:

public partial class AnonymousUID
{
    public string UID { get; set; }
    public string AnonymousUID1 { get; set; }
}
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());
        ...
    }
}
EF映射构造函数的实现方式如下:

public partial class AnonymousUID
{
    public string UID { get; set; }
    public string AnonymousUID1 { get; set; }
}
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());
        ...
    }
}
数据库上下文类的实现方式如下:

public partial class AnonymousUID
{
    public string UID { get; set; }
    public string AnonymousUID1 { get; set; }
}
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());
        ...
    }
}
但仍会引发以下异常:

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(预发行版)。

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

...HasColumnName("anonymousUID");

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

您显示的代码是否是唯一使用
匿名UID
名称的地方?在生成的
DbContext
中,您的
DbSet
的名称是什么

我构建了一个测试应用程序,没有出现任何错误,这里是完整的:

   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();
        }
    }
public部分类匿名uid
{
[关键]
公共int-UID{get;set;}
公共字符串AnonymousUID1{get;set;}
}
公共类模型:DbContext
{
公共数据库集匿名uids{get;set;}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.Property(a=>a.AnonymousUID1)
.HasColumnName(“匿名UID”);
modelBuilder.Entity()
.ToTable(“匿名UID”);
}
}
班级计划
{
静态void Main(字符串[]参数)
{
var模型=新模型();
var a=新的匿名uid();
a、 AnonymousUID1=“你好,世界”;
model.AnonymousUIDs.Add(a);
model.SaveChanges();
var applications=model.AnonymousUIDs.ToList();
Console.WriteLine(applications.Count);
Console.ReadLine();
}
}
已创建此数据库:

using (var context = new MyDbContext())
{
    var foos = from foo in context.Foos select foo;
    ...
}


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

我也有类似的问题,但我无法重命名该列,因为它会破坏旧代码。电动工具生成的类型名称都是小写的。我更改了冲突类型的大小写,结果成功了


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

似乎不太可能,但您可以尝试将列名改为以小写字母“a”开头-
HasColumnName(“匿名UID”)
@qujck这似乎是一个遥远的目标,但它确实是一个好目标:-)它成功了!如果数据库中的列名不区分大小写,我可以在
hascollanname
方法中使用我喜欢的任何大小写,以避免代码中的类/成员名称冲突。请将您的评论移到回答部分,我将很高兴地向上投票并接受它:-)我能够在EF6 Beta1版本上复制这一点,但它不再在最新的夜间版本上进行谴责。你能试一下夜间构建并确认它已修复吗?以下是如何为夜间构建设置NuGet提要的步骤:谢谢,Mark。我已经用数据库上下文实现的代码更新了这个问题。我正在为
DbSet
使用名称
AnonymousUIDs
,因此这里不应该有任何名称冲突。我注意到您的
DbContext.OnModelCreating
覆盖的实现与“我的”自动生成的有点不同,但我不清楚应该如何更改我的自动生成代码,以及它是否真的会有所不同?这就是我想知道的-我在我的测试应用程序上更新了我的OnModelCreating,以与您的完全匹配,我没有发现错误。看起来它真的在代码中的其他地方。