Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EntityFramework和级联删除_C#_Entity Framework_Cascading Deletes - Fatal编程技术网

C# EntityFramework和级联删除

C# EntityFramework和级联删除,c#,entity-framework,cascading-deletes,C#,Entity Framework,Cascading Deletes,我对级联删除有问题。我想使用它,如果可能的话,但在某些情况下,它是不适合我。 我已将我的DbContext设置为如下所示: public class DatabaseContext : IdentityDbContext<User> { // Define our tables public DbSet<Company> Companies { get; set; } public DbSet<Center> Centers { ge

我对级联删除有问题。我想使用它,如果可能的话,但在某些情况下,它是不适合我。 我已将我的DbContext设置为如下所示:

public class DatabaseContext : IdentityDbContext<User>
{

    // Define our tables
    public DbSet<Company> Companies { get; set; }
    public DbSet<Center> Centers { get; set; }
    public DbSet<Collection> Collections { get; set; }
    public DbSet<UserCenter> UserCenters { get; set; }
    public DbSet<Journal> Journal { get; set; }

    /// <summary>
    /// static constructor (only gets called once)
    /// </summary>
    static DatabaseContext()
    {

        // Create the database and insert our records
        Database.SetInitializer<DatabaseContext>(new DatabaseInitializer());
    }

    /// <summary>
    /// Default constructor
    /// </summary>
    public DatabaseContext()
        : base("DefaultConnection")
    {

        // Write our SQL to the debug window
        this.Database.Log = s => Debug.WriteLine(s);

        // Disable Lazy Loading
        base.Configuration.LazyLoadingEnabled = false;
    }

    // Public static method for OWIN
    public static DatabaseContext Create()
    {
        return new DatabaseContext();
    }

    /// <summary>
    /// Overrides the inherited OnModelCreated method.
    /// </summary>
    /// <param name="modelBuilder">The DbModelBuilder</param>
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        // Change default table names for Identity Framework
        modelBuilder.Entity<IdentityRole>().ToTable("Roles");
        modelBuilder.Entity<IdentityUserRole>().ToTable("UserRoles");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaims");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogins");

        // Create mappings for Identity Framework
        modelBuilder.Entity<IdentityUserLogin>().HasKey(m => new { m.UserId, m.ProviderKey });
        modelBuilder.Entity<IdentityRole>().HasKey<string>(m => m.Id);
        modelBuilder.Entity<IdentityUserRole>().HasKey(m => new { m.RoleId, m.UserId });
        modelBuilder.Entity<User>().HasMany(m => m.Logins).WithRequired().HasForeignKey(m => m.UserId);
        modelBuilder.Entity<IdentityRole>().HasMany(m => m.Users).WithRequired().HasForeignKey(m => m.RoleId);

        // Create our mappings
        modelBuilder.Entity<UserCenter>().HasKey(m => new { m.UserId, m.CenterId });
        modelBuilder.Entity<Center>().HasRequired(m => m.Company).WithMany(m => m.Centers).HasForeignKey(m => m.CompanyId);
        modelBuilder.Entity<Center>().HasMany(m => m.Collections).WithRequired().HasForeignKey(m => m.CenterId);
        modelBuilder.Entity<Company>().HasMany(m => m.Members).WithOptional().HasForeignKey(m => m.CompanyId).WillCascadeOnDelete(false);

        // Archive relationships
        modelBuilder.Entity<User>().HasOptional(m => m.CreatedBy).WithMany().HasForeignKey(m => m.CreatedById).WillCascadeOnDelete(false);
        modelBuilder.Entity<User>().HasOptional(m => m.ModifiedBy).WithMany().HasForeignKey(m => m.ModifiedById).WillCascadeOnDelete(false);
        modelBuilder.Entity<Company>().HasRequired(m => m.CreatedBy).WithMany().HasForeignKey(m => m.CreatedById).WillCascadeOnDelete(false);
        modelBuilder.Entity<Company>().HasRequired(m => m.ModifiedBy).WithMany().HasForeignKey(m => m.ModifiedById).WillCascadeOnDelete(false);
        modelBuilder.Entity<Collection>().HasRequired(m => m.CreatedBy).WithMany().HasForeignKey(m => m.CreatedById).WillCascadeOnDelete(false);
        modelBuilder.Entity<Collection>().HasRequired(m => m.ModifiedBy).WithMany().HasForeignKey(m => m.ModifiedById).WillCascadeOnDelete(false);
        modelBuilder.Entity<Center>().HasRequired(m => m.CreatedBy).WithMany().HasForeignKey(m => m.CreatedById).WillCascadeOnDelete(false);
        modelBuilder.Entity<Center>().HasRequired(m => m.ModifiedBy).WithMany().HasForeignKey(m => m.ModifiedById).WillCascadeOnDelete(false);
        modelBuilder.Entity<Journal>().HasRequired(m => m.User).WithMany().HasForeignKey(m => m.UserId).WillCascadeOnDelete(false);
    }
}
公共类数据库上下文:IdentityDbContext { //定义我们的表格 公共数据库集公司{get;set;} 公共数据库集中心{get;set;} 公共数据库集集合{get;set;} 公共数据库集用户中心{get;set;} 公共数据库集日志{get;set;} /// ///静态构造函数(只调用一次) /// 静态数据库上下文() { //创建数据库并插入我们的记录 SetInitializer(新的DatabaseInitializer()); } /// ///默认构造函数 /// 公共数据库上下文() :base(“默认连接”) { //将SQL写入调试窗口 this.Database.Log=s=>Debug.WriteLine; //禁用延迟加载 base.Configuration.LazyLoadingEnabled=false; } //OWIN的公共静态方法 公共静态数据库上下文创建() { 返回新的DatabaseContext(); } /// ///重写继承的OnModelCreated方法。 /// ///DbModelBuilder 模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder) { //更改Identity Framework的默认表名 modelBuilder.Entity().ToTable(“角色”); modelBuilder.Entity().ToTable(“用户角色”); modelBuilder.Entity().ToTable(“用户声明”); modelBuilder.Entity().ToTable(“用户登录”); //为Identity Framework创建映射 modelBuilder.Entity().HasKey(m=>new{m.UserId,m.ProviderKey}); modelBuilder.Entity().HasKey(m=>m.Id); modelBuilder.Entity().HasKey(m=>new{m.RoleId,m.UserId}); modelBuilder.Entity().HasMany(m=>m.Logins).WithRequired().HasForeignKey(m=>m.UserId); modelBuilder.Entity().HasMany(m=>m.Users).WithRequired().HasForeignKey(m=>m.RoleId); //创建我们的映射 modelBuilder.Entity().HasKey(m=>new{m.UserId,m.CenterId}); modelBuilder.Entity().HasRequired(m=>m.Company)。有许多(m=>m.Centers)。HasForeignKey(m=>m.CompanyId); modelBuilder.Entity().HasMany(m=>m.Collections).WithRequired().HasForeignKey(m=>m.CenterId); modelBuilder.Entity().HasMany(m=>m.Members).WithOptional().HasForeignKey(m=>m.CompanyId).WillCascadeOnDelete(false); //归档关系 modelBuilder.Entity().HasOptional(m=>m.CreatedBy).WithMany().HasForeignKey(m=>m.CreatedById).WillCascadeOnDelete(false); modelBuilder.Entity().HasOptional(m=>m.ModifiedBy).WithMany().HasForeignKey(m=>m.ModifiedById).WillCascadeOnDelete(false); modelBuilder.Entity().HasRequired(m=>m.CreatedBy).WithMany().HasForeignKey(m=>m.CreatedById).WillCascadeOnDelete(false); modelBuilder.Entity().HasRequired(m=>m.ModifiedBy).WithMany().HasForeignKey(m=>m.ModifiedById).WillCascadeOnDelete(false); modelBuilder.Entity().HasRequired(m=>m.CreatedBy).WithMany().HasForeignKey(m=>m.CreatedById).WillCascadeOnDelete(false); modelBuilder.Entity().HasRequired(m=>m.ModifiedBy).WithMany().HasForeignKey(m=>m.ModifiedById).WillCascadeOnDelete(false); modelBuilder.Entity().HasRequired(m=>m.CreatedBy).WithMany().HasForeignKey(m=>m.CreatedById).WillCascadeOnDelete(false); modelBuilder.Entity().HasRequired(m=>m.ModifiedBy).WithMany().HasForeignKey(m=>m.ModifiedById).WillCascadeOnDelete(false); modelBuilder.Entity().HasRequired(m=>m.User).WithMany().HasForeignKey(m=>m.UserId).WillCascadeOnDelete(false); } } 如您所见,我有一些存档映射,在删除时禁用了级联。这是出于设计,因为我不想删除某个项目,它会删除创建/修改该项目的用户:)

如果我删除了一个中心,并且它有一些集合,那么它会很好地删除,并且这些集合会被删除。同样,如果我删除一个用户并且他有一些用户中心,这两个都会被删除,但是如果我尝试删除一个公司(该公司有用户,用户有用户中心),它会失败,我会得到一个异常:

exceptionMessage=删除语句与引用约束“FK_dbo.Users_dbo.companys\u CompanyId”冲突。冲突发生在数据库“melanite”、表“dbo.Users”、列“CompanyId”中。 声明已终止

我可以看到它在CompanyId字段为用户发出呻吟,因此我更改了这行:

modelBuilder.Entity<Company>().HasMany(m => m.Members).WithOptional().HasForeignKey(m => m.CompanyId).WillCascadeOnDelete(false);
modelBuilder.Entity().HasMany(m=>m.Members).WithOptional().HasForeignKey(m=>m.CompanyId).WillCascadeOnDelete(false);
因为如果我删除一个用户,我不希望它删除该用户所属的公司。 但是,另一方面,如果我删除一家公司,我确实希望它删除用户s


有人知道如何解决我的问题吗?

只需将您的FK配置为在级联时删除:

modelBuilder.Entity<Company>().HasMany(m => m.Members).WithOptional().HasForeignKey(m => m.CompanyId).WillCascadeOnDelete(true);
modelBuilder.Entity().HasMany(m=>m.Members).WithOptional().HasForeignKey(m=>m.CompanyId).WillCascadeOnDelete(true);

级联删除始终在一个方向上工作,从引用的表(公司)到引用的表(用户),因此删除公司也会删除其用户,但删除用户不会对引用的公司做任何事情。

在删除公司之前,必须将用户公司id更新为null否,我想让它删除属于该公司的用户。我只是在回答我自己的问题。但是干杯,这是完全正确的。