播种具有一对多关系的用户数据库

时间:2013-06-24 22:56:19

标签: asp.net-mvc-4 entity-framework-5 azure-sql-database ef-migrations seeding

我有一个MVC4项目,它使用Entity Framework 5(代码优先)和代码优先迁移。该网站使用SimpleMembership。我正在尝试播种用户表,但遇到与导航属性设置有关的错误。

我有一个AccountUser型号。 SimpleMembership使用User模型作为我的自定义users表。这种关系是一对多关系,每AccountUserUsersAccountUser。我试图在种子时间设置Accountpublic 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

当我打电话给Account = adminAccount

时,我似乎正在运行
  1. 如果我尝试包含导航属性"No mapping exists from object type MyProject.Models.Account to a known managed provider native type.",我会收到错误:

      

    AccountId = adminAccount.AccountId

  2. 如果我尝试仅包含FK参考"Invalid column name 'Account'",我会收到错误消息:

      

    Account

  3. 如果我不包含AccountId"Invalid column name 'Account'",我也会

      

    SimpleMembership


  4. 我应该指出,我在我的课程中只使用了导航属性。当我添加外键属性时,一切都爆炸了(有与FK有关的错误但是我无法很好地重现它们以便在这里发布它们并且它们可能与我的数据库需要重新创建有关。我看到了上面的内容 - 带有新的无表数据库的错误。

    另外,我正在使用SQL Azure作为我的SQL数据库。

    这似乎是{{1}}的常见用例;我不知道它给了我这么多麻烦。

1 个答案:

答案 0 :(得分:1)

正如我想的那样,这是一个非常愚蠢的错误。基本上,在我尝试将其ID分配给新Account之前,尚未在数据库中创建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更改为正确的ID时,它工作得很好。这让我意识到在尝试将AccountId分配给Users表之前,我没有将Account上下文更改提交到数据库。

我只是在context.SaveChanges();之后添加了context.Accounts.AddOrUpdate(adminAccount);,一切正常。

好悲伤......