19

VS 2013 RTM、EF 6 を使用した MVC 5 プロジェクトで、ApplicationUser (個別アカウント認証のデフォルト) に基づいてコントローラーをスキャフォールディングしようとしました。ApplicationUserとの両方IdentityUserが Users テーブルにマップされます。ウィザードは、編集のためにコンテキスト ファイルを開き、ApplicationUser (ApplicationUsers) の新しいデータベース セットを追加しようとしますが、次のエラーで失敗します。

Unable to retrieve metadata for ApplicationUser. Multiple object sets per type are not supported. The object sets ApplicationUsers and Users can both contain instances of type ApplicationUser ソリューションには への参照またはインスタンスがありませんApplicationUsers

これは既知の問題ですか? (PMC から) オプション付きのコマンド ラインを使用して、スキャフォールディングを実行できますか? 注: ApplicationUser を参照するモデルを指定すると、スキャフォールディングによって追加の db セットがコンテキスト クラスに追加されます (それを削除して生成コントローラーで参照を修正すると、アプリは機能します)。

4

8 に答える 8

7

上記の問題と解決策を読んでください。私のエラーテキストは次のとおりです。

タイプごとの複数のオブジェクト セットはサポートされていません。オブジェクト セット 'ApplicationUsers' と 'Users' はどちらもタイプ 'DataLayerIdentity.Models.ApplicationUser' のインスタンスを含むことができます

私が遊んでモデルを足場にしたときにエラーが作成されたのではないかと思います: 新しいコントローラーの ApplicationUser 。

から以下を削除して解決しました:ApplicationDbContext.cs

    public System.Data.Entity.DbSet<DataLayerIdentity.Models.ApplicationUser> ApplicationUsers
    {
        get;
        set;
    }

問題を解決するために行われたその他の変更はありません。これが誰かに役立つことを願っています。

于 2014-08-12T16:03:32.810 に答える
1

ApplicationUsersController を作成しようとしている場合は、次の手順に従ってください。

  1. IdentityModels.cs からこの行を削除します

    public System.Data.Entity.DbSet<Project.Models.ApplicationUser> ApplicationUsers { get; set; }
    
  2. プロジェクトをビルドする

    control + shift + b
    
  3. コントローラーを生成する

    Right click on the 'Controllers' folder.
    Add > Controller
    MVC Controller with views, using Entity Framework
    Model Class: ApplicationUser
    Add
    
  4. IdentityModels.cs に戻り、この行を再度削除します

    public System.Data.Entity.DbSet<Project.Models.ApplicationUser> ApplicationUsers { get; set; }
    
  5. プロジェクトをビルドする

    control + shift + b
    
  6. ApplicationUsersController.cs で、データベース呼び出しを ApplicationUsers から Users に変更します。

    control + f to bring up 'Find and Replace'
    Click 'Replace in files'
    Find what: db.ApplicationUsers
    Replace with: db.Users
    Replace All
    
  7. 再生を押して指を交差させます:)

于 2015-10-01T22:45:37.480 に答える
0

他にできること: 空のコントローラーを作成し、DataContext のコードを自分で追加します。

    protected ApplicationDbContext db { get; private set; }

    public HomeController() : this(new ApplicationDbContext())
    {
    }

    public HomeController(ApplicationDbContext db)
    {
        this.db = db;
    }

次に、Index、Create などのメソッドを作成し、それぞれを右クリックして [ビューを追加...] を使用してビューを作成します。リストを使用してビューをスキャフォールディングし、適切なテンプレートを作成して、ApplicationUser をモデルとして選択します。

重要: 「データ コンテキスト クラス」のエントリを削除しないと、同様のエラーが再び発生します。ただし、「データ コンテキスト クラス」を空のままにしておくと、ビューの足場はうまく機能します。

于 2014-01-31T10:15:22.157 に答える
0

コンテキストから DbSet を削除し、コントローラーの参照を ApplicationUsers から Users に変更することで問題を修正しました。それは機能しましたが、今ではユーザーを足場にする意味がありません。多くのことをトップレベルで維持する必要があり、それは正しく機能しません。ビューモデルとリポジトリが私が行きたい方法であることがわかりました。

于 2014-04-09T20:19:48.823 に答える