2

私はしばらくこれに取り組んできましたが、本当に理解できません。EF5、Mvc 4、table-per-type 継承を使用しています。

UserProfile から継承するクラス Tenant と Landlord があります。ユーザーを登録するときに、必要なアカウントの種類を選択し、この選択に基づいて、フォームに入力した詳細 (ユーザー名、名、姓、電子メール、アカウントの種類、パスワード) を UserProfile テーブルに追加する必要があります。次に、そのテーブルの PK を、選択したアカウントの種類 (テナントまたは家主) に一致するテーブルへの外部キーとして追加します。

この方法を使用して上記を達成しようとしましたが、その質問で説明されている問題が発生しました。

テナントにマップされるプロパティを持つ RegisterTenantModel クラスを作成し、タイプ RegisterTenantModel のオブジェクトを AccountController/Register に渡します...

// ...
if (tenantModel.AccountType == AccountType.Tenant)
                {
                    using (var db = new LetLordContext())
                    {
                        var t = db.UserProfile.Create<Tenant>();

                        WebSecurity.CreateUserAndAccount(tenantModel.UserName, tenantModel.Password,
                             t = new Tenant
                            {
                               AccountType = tenantModel.AccountType,
                               DateWantToRentFrom = DateTime.Now, 
                               DateWantToRentTo = DateTime.Now, 
                               DesiredPropertyLocation = "",
                               Email = tenantModel.Email, 
                               FirstName = tenantModel.FirstName,
                               UserId = WebSecurity.CurrentUserId, 
                               UserName = WebSecurity.CurrentUserName

                               // More properties that map to Tenant entity
                               // ...
                            },
                            false);

                        db.SaveChanges();

...しかし、Invalid column name内部の列名ごとにエラーが発生していますt= new Tenant

誰かが似たようなことをしなければならなかったことがありますか? 私はこれに正しい方法で取り組んでいますか?助けていただければ幸いです。

編集

Antonio Simunovic が以下に投稿した内容に基づいて、問題が何であるかを理解するようになったと思います。私WebSecurity.InitializeDatabaseConnection()はこのように行きます...

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

...だから私が呼び出すとWebsecurity.CreatUserAndAccount()AccountController/Registerのパラメータに従って UserProfile テーブルに書き込んでいますWebSecurity.InitializeDatabaseConnection()。上記のリンクの質問を見ると、フォームで選択されたアカウントの種類に基づいて、Tenant または Landlord のいずれかが呼び出しによって UserProfile テーブルに追加されることがわかります...

var tenant = db.UserProfile.Create<Tenant>();
//...
db.UserProfile.Add(tenant);
db.SaveChanges();

...重複するエントリが UserProfile テーブルに追加されます。

解決策は、新しいテーブルを作成し、それを指すことだと思いますWebSecurity.InitializeDatabaseConnection()

4

4 に答える 4

2

WebSecurity.InitializeDatabaseConnection() メソッドの呼び出しはどのようになりますか? この呼び出しは、ユーザー データを格納するデータベース テーブルを識別します。

WebSecurity.CreateUserAndAccount() メソッドは、コンテキストを使用して提供されたデータを保存しません。3 番目の呼び出し引数のオブジェクト プロパティ名を、InitializeDatabaseFile() メソッドで定義されたテーブルの列にマップするだけです。

SimpleMembership の仕組みに慣れていない場合は、次の記事を ご覧ください。 -new-asp-net-4-5-web-forms-and-asp-net-mvc-4-templates.aspx

于 2013-01-30T19:44:44.893 に答える
1

まったく同じ症状が見られましDbSet<BaseClassName>た。これは、基本クラスをDbContext.

(直感に反します。アプリケーションで基本クラス エンティティのコレクションを参照する必要はありませんが、これで終わりです。)

于 2015-03-25T17:09:10.927 に答える
0

サブクラスに TPT のテーブル名で注釈を付けるのを忘れたときに、このエラーが発生しました。

[Table("Tenant")]
public class Tenant : UserProfile { ...

これと同じくらい簡単でしょうか?

編集

クイック検索では、エンティティ内のフィールドをペアにして、一度に 1 つずつ追加し直して、1 つのフィールドが原因かどうかを確認することもお勧めします (多くの失敗した列を示すエラー メッセージが表示されます)。これは私には少し疑わしいように思えますが、試してみる価値があるかもしれません:

Entity Framework 5 無効な列名エラー

于 2013-01-30T16:56:22.483 に答える