0

asp.net 4.5でWebアプリケーションを設計するために、エンティティフレームワークコードの最初のアプローチを使用しています。以下のように、コードファーストエンティティのasp.netメンバーシップ関連のすべてのテーブルを変換しました

public class Application
    {

        public string ApplicationName { get; set; }
        [Key]
        public System.Guid ApplicationId { get; set; }
        public string Description { get; set; }

        public virtual ICollection<Membership> Memberships { get; set; }
        public virtual ICollection<Role> Roles { get; set; }
        public virtual ICollection<User> Users { get; set; }
    }

    public class Membership
    {
        [ForeignKey("Application")]
        public System.Guid ApplicationId { get; set; }
        [Key, ForeignKey("User")]
        public System.Guid UserId { get; set; }
        public string Password { get; set; }
        public int PasswordFormat { get; set; }
        public string PasswordSalt { get; set; }
        public string Email { get; set; }
        public string PasswordQuestion { get; set; }
        public string PasswordAnswer { get; set; }
        public bool IsApproved { get; set; }
        public bool IsLockedOut { get; set; }
        public System.DateTime CreateDate { get; set; }
        public System.DateTime LastLoginDate { get; set; }
        public System.DateTime LastPasswordChangedDate { get; set; }
        public System.DateTime LastLockoutDate { get; set; }
        public int FailedPasswordAttemptCount { get; set; }
        public System.DateTime FailedPasswordAttemptWindowStart { get; set; }
        public int FailedPasswordAnswerAttemptCount { get; set; }
        public System.DateTime FailedPasswordAnswerAttemptWindowsStart { get; set; }
        public string Comment { get; set; }
        public virtual Application Application { get; set; }
        public virtual User User { get; set; }
    }

    public class Profile
    {
        [Key, ForeignKey("User")]
        public System.Guid UserId { get; set; }
        public string PropertyNames { get; set; }
        public string PropertyValueStrings { get; set; }
        public byte[] PropertyValueBinary { get; set; }
        public System.DateTime LastUpdatedDate { get; set; }
        public virtual User User { get; set; }
    }

    public  class Role
    {
        [ForeignKey("Application")]
        public System.Guid ApplicationId { get; set; }
        [Key]
        public System.Guid RoleId { get; set; }
        public string RoleName { get; set; }
        public string Description { get; set; }

        public virtual Application Application { get; set; }
        public virtual ICollection<User> Users { get; set; }
    }

    public  class User
    {
        [ForeignKey("Application")]
        public System.Guid ApplicationId { get; set; }
        [Key]
        public System.Guid UserId { get; set; }
        public string UserName { get; set; }
        public bool IsAnonymous { get; set; }
        public System.DateTime LastActivityDate { get; set; }

        public virtual Application Application { get; set; }
        public virtual Membership Membership { get; set; }
        public virtual Profile Profile { get; set; }
        public virtual ICollection<Role> Roles { get; set; }
    }

私のデータコンテキストと初期化クラスは以下の通りです

 public class TrainningInitializer : DropCreateDatabaseIfModelChanges<TrainningContext>
    {
        protected override void Seed(TrainningContext context)
        {

        }

    }

 public partial class TrainningContext : DbContext
    {
        public TrainningContext()
            : base("name=TrainningContext")
        {
        }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {

        }

        public DbSet<Application> Applications { get; set; }
        public DbSet<Membership> Memberships { get; set; }
        public DbSet<Profile> Profiles { get; set; }
        public DbSet<Role> Roles { get; set; }
        public DbSet<User> Users { get; set; }


    }

Global.asax 内の application_start イベントで以下のように Initializer を設定しています。

Database.SetInitializer<TrainningContext>(new TrainningInitializer());

しかし、アプリケーションを実行していると、以下のエラーが発生します

Introducing FOREIGN KEY constraint 'FK_dbo.RoleUsers_dbo.Users_User_UserId' on table 'RoleUsers' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint. See previous errors.

誰かが私のエンティティクラスを修正するのを手伝ってくれますか?

4

1 に答える 1

0

Applicationエンティティを削除すると、この削除はRolesと にカスケードされ、Users次に からRoles結合RoleUsersテーブルにカスケードされ、 から にカスケードさUsersRoleUsersます。Applicationテーブルからテーブルへのこれらの2つの削除パスはRoleUsers、例外が話している「複数のカスケードパス」です。SQL Server では許可されていません。

これら 2 つのテーブルの外部キーは NULL 可能ではないため、RolesUsersのリレーションシップに対してカスケード削除がデフォルトで有効になっているため、リレーションシップが必要です。必須のリレーションシップでは、カスケード削除がデフォルトでオンになっています。ApplicationApplicationId

ただし、Fluent API を使用してオフにすることができます。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Application>()
        .HasMany(a => a.Roles)
        .WithRequired(r => r.Application)
        .HasForeignKey(r => r.ApplicationId)
        .WillCascadeOnDelete(false);

    modelBuilder.Entity<Application>()
        .HasMany(a => a.Users)
        .WithRequired(u => u.Application)
        .HasForeignKey(u => u.ApplicationId)
        .WillCascadeOnDelete(false);
}

(おそらく、2 つのうちの 1 つに十分です。)

Applicationここでエンティティを削除する場合は、関連するRolesandUsersも削除する必要があります。データベースが自動的にそれを行うことはもうありません。

于 2013-05-16T20:13:55.293 に答える