0

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 */
}
4

1 に答える 1

0

この質問を無視すると、問題はWebSecurity.InitializeDatabaseConnectionまたはUserクラスのタイプミスでした。

Webセキュリティはデータベース「MyContext」にUsersというテーブルを設定しますが、私のクラスはUserというテーブルを作成します

WebSecurity.InitializeDatabaseConnection("MyContext", "Users", "UserId", "UserName", autoCreateTables: true);

[Table("User")]
public class User
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }

}

于 2013-03-08T16:30:34.563 に答える