0

EntityFramework5 を使用してリポジトリ パターンを実装しようとしています。私はすでに仕事の基本を手に入れました。私のリポジトリは必要な場合にのみロードされ、データは必要に応じてデータベースに挿入/更新/取得されています。問題は、マッピングを含むテーブルを正しく作成できないか、まったく作成できないことです。ここでも、マップされたテーブルを操作してデータベースに作成する方法について話している記事をいくつかオンラインで読んでいますが、成功していません。私の質問をここに渡します。

私のシナリオでそれを機能させるにはどうすればよいですか?

これまでに行ったことを説明します。

以下のこのメソッドは、おそらくマッピングとテーブルを作成するためにオーバーライドされます。

PS:Generics.InvokeGenericMethod私が作成した方法であり、機能しています。それはそれが言うことをします:)

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        foreach (Type entityType in Repositories.Keys)
        {
            //Invokes the Entity method from DbModelBuilder injecting the class type.
            Generics.InvokeGenericMethod(modelBuilder, typeof(DbModelBuilder), entityType, "Entity", null);
        }

        foreach (GaiaEntityConfiguration config in EntityConfigurations)
        {
            //Defines each mapping existing in the context
            config.SetConfiguration(modelBuilder);
        }
    }

機能していない部分は、SetConfiguration を使用する場所です。SetConfiguration は、マッピングを持つコンテキストに追加されたクラスごとに作成したメソッドであり、そのマッピングをデータベースにミラーリングします。

以下に一例を示します (この場合、受信者には多くのメッセージがあり、メッセージには多くの受信者/多対多の関連付けがあります):

PS: 私が試した別のアプローチを確認できるように、コメント付きのコードを残しました。

    public RecipientEntityConfiguration()
    {
        this.LeftKey = "RecipientId";
        this.RightKey = "MessageId";
        this.Schema = "Hermes";
        this.TableName = "RecipientMessage";
    }

    public override void SetConfiguration(DbModelBuilder modelBuilder)
    {
        //EntityTypeConfiguration<Recipient> entityTypeConfiguration = new EntityTypeConfiguration<Recipient>();

        //entityTypeConfiguration
        //    .HasMany<Message>(r => r.Messages)
        //    .WithMany(m => m.Recipients)
        //    .Map(mr =>
        //    {
        //        mr.MapLeftKey(this.LeftKey);
        //        mr.MapRightKey(this.RightKey);
        //        mr.ToTable(this.TableName, this.Schema);
        //    });
        modelBuilder.Entity<Recipient>()
            .HasMany<Message>(r => r.Messages)
            .WithMany(m => m.Recipients)
            .Map(mr =>
            {
                mr.MapLeftKey(this.LeftKey);
                mr.MapRightKey(this.RightKey);
                mr.ToTable(this.TableName, this.Schema);
            });
        //modelBuilder.Configurations.Add<Recipient>(entityTypeConfiguration);
    }

this.Database.Initialize(false);呼び出されると、次のエラーが発生します。

Value cannot be null.
Parameter name: key

スタックトレース:

   at System.Collections.Generic.Dictionary`2.FindEntry(TKey key)
   at System.Collections.Generic.Dictionary`2.TryGetValue(TKey key, TValue& value)
   at System.Data.Entity.ModelConfiguration.Configuration.Mapping.SortedEntityTypeIndex.Add(EdmEntitySet entitySet, EdmEntityType entityType)
   at System.Data.Entity.ModelConfiguration.Configuration.Mapping.EntityMappingService.Analyze()
   at System.Data.Entity.ModelConfiguration.Configuration.Mapping.EntityMappingService.Configure()
   at System.Data.Entity.ModelConfiguration.Configuration.ModelConfiguration.ConfigureEntityTypes(DbDatabaseMapping databaseMapping, DbProviderManifest providerManifest)
   at System.Data.Entity.ModelConfiguration.Configuration.ModelConfiguration.Configure(DbDatabaseMapping databaseMapping, DbProviderManifest providerManifest)
   at System.Data.Entity.DbModelBuilder.Build(DbProviderManifest providerManifest, DbProviderInfo providerInfo)
   at System.Data.Entity.DbModelBuilder.Build(DbConnection providerConnection)
   at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
   at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
   at System.Data.Entity.Internal.InternalContext.Initialize()
   at System.Data.Entity.Database.Initialize(Boolean force)
   at Gaia.Repository.GaiaContext..ctor(GaiaContextConfiguration config) in E:\Gaia\Gaia.Repository\GaiaContext.cs:line 37
   at Hermes.HMail.SendMessage(Int64 sender, Int64[] toUsers, String subject, String content, FileStream attachment) in G:\Gaia\Hermes\HMail.cs:line 78
   at Gaia.Controllers.ApplicationController.Test() in G:\Gaia\Gaia\Controllers\ApplicationController.cs:line 18
   at lambda_method(Closure , ControllerBase , Object[] )
   at System.Web.Mvc.ActionMethodDispatcher.<>c__DisplayClass1.<WrapVoidAction>b__0(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)

何か案は?

ありがとう。

4

2 に答える 2

2

まず、EF Book pg.57で、インライン構成はすべて、modelbuilderに追加されたすべての構成の後にのみ表示されるはずであることがわかりました。コードをチェックします。

次に、このバージョンのコードを試して、modelbuilderにマッピングを自動的に追加します。目標は、EntityTypeConfigurationsから呼び出しを削除し、コンテキストに構成を追加する純粋な方法を使用することです。コードをSetConfigurationからコンストラクターに移動し、私のバージョンを使用してみてください。それは私にとってもうまくいきました。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     var entityMapTypes = assembly.GetTypes().Where(
         (t => t.BaseType != null && t.BaseType.IsGenericType && 
               t.BaseType.GetGenericTypeDefinition() == typeof(EntityTypeConfiguration<>)));

     foreach (var mapType in entityMapTypes)
     {
         dynamic configurationInstance = Activator.CreateInstance(mapType);
         modelBuilder.Configurations.Add(configurationInstance);
     }
} 
于 2012-11-05T18:53:02.737 に答える
1

これはstackoverflowでの最初の回答になるので、誰かの役に立てば幸いです! EF は敏感な生き物であり、「Type」という名前のプロパティを持つエンティティを認識しないことが判明したため、エンティティがある場合は、「EntityType」に沿った名前に変更してください。

また、抽象型を持つプロパティで同様の問題を抱えている人についても聞いたことがあります。誰かの問題が上記のものではない場合に備えて、プロパティの型を見て、それらが抽象的であるかどうかを確認してください: DbContext は失敗しますモデル優先データベースの初期化

于 2012-09-14T12:38:29.507 に答える