SimpleMembershipsとEntitiesを使用してContextInitializerクラスにEntityFrameworkデータベースをシードしようとしています。以下に示すように、エンティティにはUsersテーブルへの外部キーがあるため、最初にユーザーにデータを入力し、次にContextInitializerクラスに次のようにエンティティ(イベント)を入力しました。
protected override void Seed(CustomContext context)
{
WebSecurity.InitializeDatabaseConnection("MyContext", "Users", "UserId", "UserName", autoCreateTables: true);
seedUsers(context);
seedEvents(context);
/* snip */
}
private void seedUsers(CustomContext context)
{
var roles = (SimpleRoleProvider) Roles.Provider;
var membership = (SimpleMembershipProvider) Membership.Provider;
if (!roles.RoleExists("Admin"))
{
roles.CreateRole("Admin");
}
if (membership.GetUser("test", false) == null)
{
membership.CreateUserAndAccount("test", "test");
}
if (!roles.GetRolesForUser("test").Contains("Admin"))
{
roles.AddUsersToRoles(new[] {"test"}, new[] {"Admin"});
}
}
private void seedEvents(InviteeContext context)
{
var membership = (SimpleMembershipProvider) Membership.Provider;
events = new List<Event>()
{
new Event() { name = "Test 1", owner_id = membership.GetUserId("test")},
new Event() { name = "Test 2", owner_id = membership.GetUserId("test")}
};
events.ForEach(p => context.Events.Add(p));
context.SaveChanges();
}
}
上記のようにイベントを作成すると、正しい結果events[0].owner_id == 1
が得られ、データベースでこれが機能していることがわかりますが、保存しようとすると、外部キー違反が発生します。コンテキスト(以下に表示)で設定されたユーザーを調べると、空であることがわかりますcontext.Users.Count() == 0
。だから私はどちらかだと思います
- ユーザーの追加方法は少し異なります
- ユーザーを追加した後、コンテキストを更新する必要があります(これを行う方法がわかりません)
- ユーザーをUserクラスとして作成し、コンテキストに追加する必要があります
よろしくお願いします。
私のエンティティは次のとおりです。
ユーザー:
[Table("User")]
public class User
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
public string UserName { get; set; }
}
イベント:
public class Event
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public int owner_id { get; set; }
[ForeignKey("owner_id")]
public virtual User owner { get; set; }
/* Snip */
}
私のコンテキストは次のようになります。
public class CustomContext : DbContext
{
public CustomContext()
: base("name=MyContext")
{
}
public DbSet<Event> Events { get; set; }
public DbSet<User> Users { get; set; }
/* Snip */
}