3

Entity Frameworkを使用して既存のデータベースをモデル化しています。データベース テーブルの 1 つに、テーブルと同じ名前の列AnonymousUIDが含まれています。

Entity Framework Power Tools関数のリバース エンジニアリング 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

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

I had a similar issue, but I could not rename the column because it would break legacy code. The type names that Power Tools generated are all lowercase. I changed the capitalization on the conflicting types, and it worked.

I suspect that CodeFirstDatabaseSchema is maintaining lowercase property names, but I am not sure. All I know is that changing my lowercase type names to properly capitalized type names fixed it. I hope that is helpful for someone.

于 2013-06-02T02:22:05.180 に答える