6

私のエンティティ名は「Contact」で、テーブル名は「Contact」です。ただし、デフォルトの複数化サポートにより、EF4は「Contacts」という名前のテーブルを検索します。複数化のサポートをオフにする方法について誰かが何か考えを持っていますか?

この投稿には、複数形のサポートに関する詳細があります。しかし、それでも私には答えがありません。

この投稿には次のテキストがあります。まず、この変更を行うために必要な物理的な.ttファイルがわかりません。また、この機能をすべてではなく1つのアプリでのみオフにしたい。

T4 Toolboxのコードジェネレーターでは、Visual Studio 2010でデフォルトで複数形がオンになっています。おそらく互換性の理由で複数形なしでDALを生成する必要がある場合は、前に.ttファイルに次の行を追加してこのオプションをオフにできます。 generator.Run()メソッドが呼び出されます。

C#
generator.Pluralize = false;

VB
ジェネレーター.Pluralize=False

アップデート

以下は私が使用するコードであり、以下のエラーが発生します:-

コンタクト

 public class Contact
 {
 public int ContactID { get; set; }
 public string FirstName { get; set; }
 public string LastName { get; set; }
 public string Title { get; set; }
 public DateTime AddDate { get; set; }
 public DateTime ModifiedDate { get; set; }
 }

コンテクスト:-

 public class AddressBook : DbContext
 {
 public DbSet<Contact> Contact { get; set; }

 protected override void OnModelCreating(ModelBuilder modelBuilder)
 {
  modelBuilder.Entity<Contact>().MapSingleType().ToTable("dbo.Contact");
 }

}

メインプログラム:-

using (var context = new AddressBook())
  {
   var contact = new Contact
   {
   ContactID = 10000,
   FirstName = "Brian",
   LastName = "Lara",
   ModifiedDate = DateTime.Now,
   AddDate = DateTime.Now,
   Title = "Mr."

   };
   context.Contact.Add(contact);
   int result = context.SaveChanges();
   Console.WriteLine("Result :- " + result.ToString());

  }

そして、「context.Contact.Add(contact);」で次のエラーが発生します:-

System.InvalidOperationException:データベースが作成されてから、「AddressBook」コンテキストをサポートするモデルが変更されました。データベースを手動で削除/更新するか、IDatabaseInitializerインスタンスを使用してDatabase.SetInitializerを呼び出します。たとえば、RecreateDatabaseIfModelChangesストラテジーは、データベースを自動的に削除して再作成し、オプションで新しいデータをシードします。System.Data.Entity.Infrastructure.CreateDatabaseOnlyIfNotExistsで1.InitializeDatabase(TContext context) at System.Data.Entity.Infrastructure.Database.Initialize() at System.Data.Entity.Internal.InternalContext.Initialize() at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType) at System.Data.Entity.Internal.Linq.EfInternalQuery1.Initialize()at System.Data.Entity.DbSet 1.ActOnSet(Action action,EntityState newState, TEntity entity) at System.Data.Entity.DbSet1.Add(TEntity entity)at CodeFirst.Client.Program.Main(String [] args)in E:\ Ashish \ Research \ VS Solutions \ EntityFramework \ CodeFirstApproach_EF_CTP4 \ CodeFirst.Client \ Program.cs:line 35

私はどこかで愚かな間違いを犯していると確信しています。誰かがいくつかの指示を提供できますか?

答えポールト の助けを借りて、私はこの問題と解決策をここで説明しました。

4

5 に答える 5

6

質問に対する私の理解が変化したため、さらに3番目の回答を追加しています...それは私の悪いことですか? ;)

コメントで述べたように、私はまだ学習中であり、既存のデータベースでこれをまだ試みていません。とはいえ、次のいずれかが役立つことを願っています。

Scott Guthrie によって言及された投稿 ( http://weblogs.asp.net/scottgu/archive/2010/08/03/using-ef-code-first-with-an-existing-database.aspx ) には、これが役立つと言う特定のジェフ(彼が詳しく説明しているので、コメント全体を読むことをお勧めします):

Database.SetInitializer<AddressBook>(null); //AddressBook being the context

最近、この投稿 ( http://blogs.msdn.com/b/adonet/archive/2010/07/14/ctp4announcement.aspx?PageIndex=2 ) の下にある Rowan Miller のコメントにも出くわしました。彼は、これがオプションかもしれないと示唆しています:

public class ProductContext : DbContext
{
   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
       modelBuilder.IncludeMetadataInDatabase = false;
   }
   ...
}

うまくいけば、これらのいずれかが正しい軌道に乗ることができます.

于 2010-09-07T02:15:49.380 に答える
2

特定のテーブル名をターゲットにしようとしているだけですか?

もしそうなら、これはあなたが探している答えかもしれません:

public class FooDataContext : DbContext
{
    public DbSet<Contact> Contacts { get; set; }
}

    protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Contact>().MapSingleType().ToTable("Contact");
    }
}

これは役に立ちますか、それとも要点を完全に見逃しましたか?

于 2010-09-05T19:34:14.767 に答える
0
    protected override void OnModelCreating(System.Data.Entity.DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Remove<PluralizingEntitySetNameConvention>();
    }
于 2014-07-24T07:09:45.583 に答える
0

そのままでは、コードファーストのものは既存のデータベースを変更または削除しません。手動で作成した既存のデータベース、または以前にプログラムを実行して作成したフレームワークがあり、その後 Contact クラスを変更したと思います。このエラーを 1 回で修正する簡単な方法は、データベースを手動で削除するか、モデルに一致するように更新することです。

ただし、コード ファーストの機能セットの真価は、開発の早い段階でデータベース スクリプトの作成と維持について心配することなく、迅速なドメインの作成とリファクタリングを可能にすることです。これを行うには、モデルに変更を加えるたびにフレームワークがデータベースを削除できるようにすると便利であることが個人的にわかりました。もちろん、これは、データベースにテスト データをシードしたいという意味でもあります。

これを実現する方法は次のとおりです。

public class MyCustomDataContextInitializer : RecreateDatabaseIfModelChanges<MyCustomDataContext> //In your case AddressBook
{
    protected override void Seed(MyCustomDataContext context)
    {
        var contact = new Contact
        {
            ContactID = 10000,
            FirstName = "Brian",
            LastName = "Lara",
            ModifiedDate = DateTime.Now,
            AddDate = DateTime.Now,
            Title = "Mr."
        };
        context.Contact.Add(contact);
        context.SaveChanges();
    }
}

次に、この初期化子を登録する必要があります (たとえば、Web アプリケーションの場合は Application_Start() で):

Database.SetInitializer(new MyCustomDataContextInitializer());

次のものが必要になることに注意してください。

using System.Data.Entity.Infrastructure;

これは役に立ちますか?

于 2010-09-06T17:04:29.747 に答える