1

Visual Studio 2012 でインターネット MVC 4 アプリケーションを作成していて、SingleMembership を使用してユーザーを追加したいと考えていました。最初に、users データベースは私が望んでいた場所ではなく、SQL/Express データベース上にあり、アプリケーションのすべてのモデル用に既に作成した SQL/Server 上にあることがわかりました。だから私がしたことは、私のデータベース用にVisual Studio 2012によって作成された接続文字列を変更することです:

<add name="Test2_Entities" connectionString="metadata=res://*/Models.Model.csdl|res://*/Models.Model.ssdl|res://*/Models.Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=FERNANDO-PC\SQLSERVER;initial catalog=Test2;persist security info=True;user id=****;password=****;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

そして、メタデータ部分でいくつかのエラーが発生し、プロバイダー名がそれを「System.Data.SqlClient」に変更したため、2 つの接続文字列が必要であることに気付きました。そのため、新しい接続文字列が実際には最初のものですが、この変更により:

<add name="Test2_Entities2" connectionString="data source=FERNANDO-PC\SQLSERVER;initial catalog=Test2;persist security info=True;user id=****;password=****;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />

データベースにユーザー テーブルを作成する代わりに、 FiltersフォルダーのInitializeSingleMemebershipAttribute.csファイルの行 (正確には 41 行目) を次のように変更しました。

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);

に:

WebSecurity.InitializeDatabaseConnection("Test2_Entities2", "UserProfile", "UserId", "UserName", autoCreateTables: true);

およびModelsフォルダーにあるAccountModels.csの他の行:

public UsersContext() : base("DefaultConnection")

に:

public UsersContext() : base("Test2_Entities")

メンバーシップ、ロール、OAuth などを制御するデフォルトのテーブルが、必要なデータベースに作成されます。(これが問題の背景であり、一部の人々はそれが役立つと考えました)

問題は、テーブルが SQL データベースに作成されるときに、 AccountModels.csで定義したデータ型にない列があり、追加のフィールドが作成されないことです。具体的には、AccountModels.csに次のクラスがあります。

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public Guid UserId { get; set; }
    public string UserName { get; set; }
    public string RandomString { get; set; }
}

作成されたテーブルでは、UserIDは int を取得し、変更しようとするとエラーが発生します。

'int' から 'uniqueidentifier' への変換は、接続されたデータベース サーバーではサポートされていません。

また、RandomString文字列がUserProfilesテーブルに表示されません。

この質問への回答: 「SingleMembership を使用してプロファイルを管理するにはどうすればよいですか」stackoverflow の質問 は非常に役立ちますが、回答が提案するようにフィールドとデータ型を変更することはできません。

足りないものはありますか?または、この変更を行う前に設定する必要があるものはありますか?

4

2 に答える 2

3

UserId タイプは、このデータベースでも生成される他のテーブルへの外部キーとして使用されるため、変更できません。データベース内のこの列の変更に成功すると、次のエラーが発生します。

UserProfile.UserId' is not the same data type as referencing column 'webpages_UsersInRoles.UserId' in foreign key 'fk_UserId'

これを試したところ、いくつかのテーブルが作成されました。ご覧のとおり、他のテーブルは UserId を使用して UserProfile テーブルにリンクしています。

ここに画像の説明を入力

しかし、このスナップショットからもわかるように、RandomString というカスタム列を追加できました。UserProfile オブジェクトを変更してテーブルに反映させることができないというコメントに困惑しました。このサイトでこれに関する多くの苦情を見たので、問題を再現できるかどうかを確認するために変更を加えてみました. この例で作業していたときに、UserId を int に戻すことができたので、それが機能し、別のプロパティ/列を追加することさえできました。このスナップショットでわかるように、それも機能しました。

ここに画像の説明を入力

しかし、その後、カスタム UserProfile を持つ古いプロジェクトを開いて変更しようとしましたが、データベースの変更が反映されませんでした。私が最後に使用したモデル (MVC 4 テンプレートによって生成されたものとは異なるカスタム モデル) に固執し、データベースを削除したり、データベース名を変更したりしても変更されませんでした。この MVC 4 テンプレートは EF 5 を使用しています。これは、そのバージョンでデータベースの移行がどのように処理されたか、および InitializeSimpleMembershipAttribute が次のコード スニペットに示すようにデータベースを作成する型破りな方法に関係していると思います。

// Create the SimpleMembership database without Entity Framework migration schema
((IObjectContextAdapter)context).ObjectContext.CreateDatabase();

簡単に言うと、これらの MVC 4 プロジェクトが UserProfile への変更が機能しないこの状態になるのを見てきましたが、まだ問題の解決策を見つけていません。解決策が見つかったら、この回答を更新します。

于 2013-01-10T20:41:46.953 に答える
1

コードから GUID 部分を削除するだけで (デフォルトの UserID を主キーのままにします)、機能します。ケビン・ユンハンスがその理由を説明しています。

MvcApplication を実行すると、テーブル構造に必要な変更が加えられるはずです。

そうでない場合: 移行を行う必要があります。 または 、データベースから UserProfile (および他の webpages_* テーブル) をドロップして、アプリケーションを実行することもできます

これは、移行プロセスに役立つ場合があります

于 2013-10-09T17:57:51.490 に答える