1

コード ファーストの移行で Entity Framework 5 (コード ファースト) を使用する MVC4 プロジェクトがあります。サイトは を使用していSimpleMembershipます。users テーブルをシードしようとしていますが、ナビゲーション プロパティの設定に関連するエラーが発生しています。

私はAccountUserモデルを持っています。モデルをカスタムテーブルとしてSimpleMembership使用します。この関係は 1 対多で、 ごとに 1 つですが、 ごとに多数あります。シード時にto関係を設定しようとしていますが、できません。UserusersAccountUserUsersAccountUserAccount


モデル (無関係なプロパティは省略):

public class User
{
    [Key]
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Description { get; set; }

    public int AccountId { get; set; }
    public virtual Account Account { get; set; }
}

public class Account
{
    [Key]
    public int AccountId { get; set; }
    public string Name { get; set; }

    // Account has many users but only one "admin" user. ID manually set.
    // Nullable because of chicken / egg problem (user requires account, account requires user)
    public int? AdminUser { get; set; }
    public virtual ICollection<User> Users { get; set; }
}

シード方法:

protected override void Seed(MyProject.Data.MyContext context)
{
    WebSecurity.InitializeDatabaseConnection("MyContext", "Users", "UserId", "UserName", autoCreateTables: true);

    Account adminAccount = new Account()
    {
        Name = "Dev",
        Description = "Dev account"
    };

    context.Accounts.AddOrUpdate(adminAccount);

    if (!WebSecurity.UserExists("dev@dev.com"))
    {
        WebSecurity.CreateUserAndAccount("dev@dev.com", "password", new User()
        {
            Email = "dev@dev.com",
            FirstName = "Dev",
            LastName = "Guy"
            // Problematic properties - see below
            // Account = adminAccount,
            // AccountId = adminAccount.AccountId
        });
    }
}

イントロの問題を実行しているように見えるのは、次のように電話したときですWebSecurity.CreateUserAndAccount

  1. ナビゲーション プロパティAccount = adminAccountを含めようとすると、エラーが発生します。

    "No mapping exists from object type MyProject.Models.Account to a known managed provider native type."

  2. FK 参照だけを含めようとするとAccountId = adminAccount.AccountId、エラーが発生します。

    "Invalid column name 'Account'"

  3. AccountorAccountIdを含めない場合は、

    "Invalid column name 'Account'"


これは、クラスのナビゲーション プロパティだけで機能していたことを指摘しておく必要があります。外部キー プロパティを追加すると、すべてが爆発しました (FK に関連するエラーがありますが、ここに投稿するほど十分に再現できず、データベースを再作成する必要があることに関連している可能性があります。上記が表示されます。 -新しいテーブルのないデータベースでのエラー。

また、SQL データベースとして SQL Azure を使用しています。

これは ; の一般的な使用例のようですSimpleMembership。何がそんなに私を悩ませているのかわからない。

4

1 に答える 1

2

思ったとおり、とてもばかげたエラーでした。基本的Accountに、その ID を new に割り当てようとする前に、まだデータベースに作成されていませんでしたUser

データベースにデータを手動で挿入しようとすると、次のエラーが発生しました。

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.Users_dbo.Accounts_AccountId". The conflict occurred in database "projectdev", table "dbo.Accounts", column 'AccountId'.

掘り下げた後、ユーザーに割り当てていた AccountID が間違っていることがわかりました。ID を正しいものに変更すると、問題なく機能しました。これにより、AccountId を Users テーブルに割り当てようとする前に、Account コンテキストの変更をデータベースにコミットしていないことに気付きました。

単に追加context.SaveChanges();しただけでcontext.Accounts.AddOrUpdate(adminAccount);、すべてうまくいきました。

やれやれだぜ...

于 2013-06-24T23:26:54.533 に答える