私はしばらくこれに取り組んできましたが、本当に理解できません。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()
。