Asp.net mvc 4 使用一对多关系设置用户数据库种子
我有一个MVC4项目,它使用EntityFramework5(代码优先)和代码优先迁移。该网站使用Asp.net mvc 4 使用一对多关系设置用户数据库种子,asp.net-mvc-4,entity-framework-5,azure-sql-database,entity-framework-migrations,seeding,Asp.net Mvc 4,Entity Framework 5,Azure Sql Database,Entity Framework Migrations,Seeding,我有一个MVC4项目,它使用EntityFramework5(代码优先)和代码优先迁移。该网站使用SimpleMembership。我正在尝试为users表设置种子,但遇到与导航属性设置相关的错误 我有一个帐户和用户模型SimpleMembership使用User模型作为我的自定义users表。这种关系是一对多的,每个用户有一个帐户,但每个帐户有许多用户。我正在尝试在种子时间将用户设置为帐户关系,但无法 模型(忽略无关属性): 当我调用WebSecurity.CreateUserAndAcco
SimpleMembership
。我正在尝试为users表设置种子,但遇到与导航属性设置相关的错误
我有一个帐户
和用户
模型SimpleMembership
使用User
模型作为我的自定义users
表。这种关系是一对多的,每个用户有一个帐户
,但每个帐户
有许多用户。我正在尝试在种子时间将用户
设置为帐户
关系,但无法
模型(忽略无关属性):
当我调用WebSecurity.CreateUserAndAccount时,我似乎正在运行intro,问题是:
如果我试图包含导航属性Account=admincount
,则会出现错误:
“不存在从对象类型MyProject.Models.Account到已知托管提供程序本机类型的映射。”
如果我试图只包括FK引用AccountId=adminAccount.AccountId
,我会得到错误:
“无效的列名‘帐户’”
如果我没有包括帐户
或帐户ID
,我也会得到
“无效的列名‘帐户’”
我应该指出,我在类中只使用了导航属性。当我添加外键属性时,一切都崩溃了(有一些与FKs相关的错误,但我无法很好地复制它们,将它们发布到这里,它们可能与我需要重新创建的数据库有关。我在一个新的、无表的数据库中看到了上述错误
此外,我正在使用SQLAzure作为我的SQL数据库
这似乎是SimpleMembership
的一个常见用例;我不知道它给我带来了多少麻烦。正如我所想,这是一个非常愚蠢的错误。基本上帐户在我尝试将其ID分配给新的用户之前,还没有在数据库中创建
当我尝试手动将数据插入数据库时,出现以下错误:
INSERT语句与外键约束“FK_dbo.Users_dbo.Accounts_AccountId”冲突。冲突发生在数据库“projectdev”表“dbo.Accounts”列“AccountId”中。
经过一番挖掘,我发现分配给用户的AccountID不正确,当我将ID更改为正确的ID时,它工作正常。这使我意识到,在尝试将其AccountID分配给Users表之前,我没有将帐户上下文更改提交给数据库
我只是在context.Accounts.AddOrUpdate(admincount);
之后添加了context.SaveChanges();
,一切正常
好悲伤…正如我所想,这是一个非常愚蠢的错误。基本上,在我试图将帐户ID分配给新的用户之前,帐户还没有在数据库中创建
当我尝试手动将数据插入数据库时,出现以下错误:
INSERT语句与外键约束“FK_dbo.Users_dbo.Accounts_AccountId”冲突。冲突发生在数据库“projectdev”表“dbo.Accounts”列“AccountId”中。
经过一番挖掘,我发现分配给用户的AccountID不正确,当我将ID更改为正确的ID时,它工作正常。这使我意识到,在尝试将其AccountID分配给Users表之前,我没有将帐户上下文更改提交给数据库
我只是在context.Accounts.AddOrUpdate(admincount);
之后添加了context.SaveChanges();
,一切正常
好悲伤
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
});
}
}