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# 实体框架不删除其他表中的行_C#_Entity Framework - Fatal编程技术网

C# 实体框架不删除其他表中的行

C# 实体框架不删除其他表中的行,c#,entity-framework,C#,Entity Framework,目前,当我试图删除一个主题时,它会被删除,但与该主题对应的其他表中的行会被孤立 这是我的模型 public class SubjectsDbContext : DbContext { public virtual DbSet<Subject> Subjects { get; set; } public virtual DbSet<FaceImage> EnrolledFaces { get; set; } public virtual DbSet&

目前,当我试图删除一个
主题时,它会被删除,但与该主题对应的其他表中的行会被孤立

这是我的模型

public class SubjectsDbContext : DbContext
{
    public virtual DbSet<Subject> Subjects { get; set; }
    public virtual DbSet<FaceImage> EnrolledFaces { get; set; }
    public virtual DbSet<KVPair> KeyValuePairs { get; set; }

    public SubjectsDbContext(string connectionString) : base(connectionString)
    {
    }

    public SubjectsDbContext()
    {
    }
}

public class Subject
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid SubjectId { get; set; }

    [Required]
    public virtual FaceImage EnrolledFace {get;set;}

    [Required]
    public DateTimeOffset EnrolledTime { get; set; }

    [Required]
    [Column(TypeName = "varchar")]
    [StringLength(64)]
    public string BiometricId { get; set; }

    public virtual ICollection<KVPair> KeyValues { get; set; }

    public Subject()
    {
        KeyValues = new List<KVPair>();
    }
}

[Table("SubjectFaces")]
public class FaceImage
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid FaceId { get; set; }

    [Required]
    public byte[] Image { get; set; }
}

[Table("SubjectData")]
public class KVPair
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid KvPairId { get; set; }

    [Required]
    [Column(TypeName = "varchar")]
    [StringLength(128)]
    public string Key { get; set; }

    [Column(TypeName = "varchar")]
    [StringLength(128)]
    public string Value { get; set; }
}
我认为我的模型不正确,我如何才能正确地注释它

更新:

在Chris的回答之后,我将我的模型改为

public class Subject
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid SubjectId { get; set; }

    [Required]
    public virtual FaceImage EnrolledFace {get;set;}

    [Required]
    public DateTimeOffset EnrolledTime { get; set; }

    [Required]
    [Column(TypeName = "varchar")]
    [StringLength(64)]
    public string BiometricId { get; set; }

    public virtual ICollection<KVPair> KeyValues { get; set; }

    public Subject()
    {
        KeyValues = new List<KVPair>();
    }
}

[Table("SubjectFaces")]
public class FaceImage
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid FaceId { get; set; }

    [Required]
    public byte[] Image { get; set; }

    [ForeignKey(nameof(SubjectId))]
    public virtual Subject Subject { get; set; }

    [Required]
    public Guid SubjectId { get; set; }
}

[Table("SubjectData")]
public class KVPair
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid KVPairId { get; set; }

    [Required]
    [Column(TypeName = "varchar")]
    [StringLength(128)]
    public string Key { get; set; }

    [Column(TypeName = "varchar")]
    [StringLength(128)]
    public string Value { get; set; }

    [ForeignKey(nameof(SubjectId))]
    public virtual Subject Subject { get; set; }

    [Required]
    public Guid SubjectId { get; set; }
}
公共类科目
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共Guid主体ID{get;set;}
[必需]
公共虚拟面映像注册面{get;set;}
[必需]
public DateTimeOffset EnrolledTime{get;set;}
[必需]
[列(TypeName=“varchar”)]
[第64段]
公共字符串ID{get;set;}
公共虚拟ICollection键值{get;set;}
公共主题()
{
KeyValues=新列表();
}
}
[表(“主题面”)]
公共类人脸图像
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共Guid FaceId{get;set;}
[必需]
公共字节[]映像{get;set;}
[外键(主语名称))]
公共虚拟主题主题{get;set;}
[必需]
公共Guid主体ID{get;set;}
}
[表(“主题数据”)]
公共类KVPair
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共Guid KVPairId{get;set;}
[必需]
[列(TypeName=“varchar”)]
[第128段]
公共字符串密钥{get;set;}
[列(TypeName=“varchar”)]
[第128段]
公共字符串值{get;set;}
[外键(主语名称))]
公共虚拟主题主题{get;set;}
[必需]
公共Guid主体ID{get;set;}
}
然而,当我尝试创建一个新的
主题时,我现在遇到了这个异常

ReferentialConstraint中的依赖属性映射到存储生成的列。专栏:“主观性”


几个小时来,我一直在尝试不同的事情(

我认为值得在上读一些EntityFramework的基础知识


您的模型需要进行一些修改,以便执行级联删除。您需要在另一个模型中交叉引用一个模型。SubjectFaces表中缺少此项。

查看您的代码,您仍然需要做更多的工作。实体类尚未完成。请在此处阅读有关代码优先实体类的更多信息。

在Subject类中引用实体时,还需要引用子实体中的主题

公共类科目
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共Guid主体ID{get;set;}
[必需]
公共虚拟长注册FaceID{get;set;}//
[ForeignKey(“EnrolledFaceId”)]
公共虚拟面映像注册面{get;set;}
[必需]
public DateTimeOffset EnrolledTime{get;set;}
[必需]
[列(TypeName=“varchar”)]
[第64段]
公共字符串ID{get;set;}
公共虚拟ICollection键值{get;set;}
公共主题()
{
KeyValues=新列表();
}
}
[表(“主题面”)]
公共类人脸图像
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共Guid FaceId{get;set;}
//添加对主题的引用
[必需]
公共主题主题{get;set;}
公共长主体{get;set;}
[必需]
公共字节[]映像{get;set;}
}
[表(“主题数据”)]
公共类KVPair
{
[关键]
[数据库生成(DatabaseGeneratedOption.Identity)]
公共Guid KvPairId{get;set;}
//添加对主题的引用
[必需]
公共长主体{get;set;}
[外键(“主体”)]
公共主题主题{get;set;}
[必需]
[列(TypeName=“varchar”)]
[第128段]
公共字符串密钥{get;set;}
[列(TypeName=“varchar”)]
[第128段]
公共字符串值{get;set;}
}

有不同的方法来构造实体,使其更容易,但是首先,让我们向
SubjectsDbContext
类添加一个方法,以使用流畅的表示法强制执行级联删除行为:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // Normally these conventions should easily target your entire model to support cascade delete
    //modelBuilder.Conventions.Add(new OneToManyCascadeDeleteConvention());
    //modelBuilder.Conventions.Add(new ManyToManyCascadeDeleteConvention());

    // However you many not want the entire model to cascade, 
    // or due to the relationshipships not being explicitly defined so the above conventions
    // may not resolve correctly.
    // These statements explicitly define the relationships and the cascade operation
    modelBuilder.Entity<Subject>().HasMany(x => x.KeyValues).WithRequired().WillCascadeOnDelete(true);
    modelBuilder.Entity<Subject>().HasRequired(x => x.EnrolledFace).WithRequiredPrincipal().WillCascadeOnDelete(true);
}
通过此更改,要在
OnModelCreating
方法中针对这些关系,我们需要稍微更改fluent符号:

    modelBuilder.Entity<Subject>().HasMany(x => x.KeyValues).WithRequired(x => x.Subject).WillCascadeOnDelete(true);
    modelBuilder.Entity<Subject>().HasRequired(x => x.EnrolledFace).WithRequiredPrincipal(x => x.Subject).WillCascadeOnDelete(true);

我尝试了此操作,但在尝试创建新主题时出现异常。{“无法确定类型“webconsole.Models.FaceImage”和“webconsole.Models.Subject”之间关联的主端。必须使用关系流API或数据批注显式配置此关联的主端。”我已通过添加外键引用修改了解决方案。在EF中,关系可以通过几种不同的方式完成。请检查此项以了解有关实体框架关系的更多信息,如果我理解正确,我只需要根据您上次的代码更改按模型进行修改。我已完成此操作,请查看我对最新模型的问题编辑。但是r我现在尝试创建主题时遇到了一个异常。需要尝试的两件事:1.将
WithRequiredPrincipal
更改为
WithRequiredDependent
…如果这样做有效,那么我需要编辑此响应!2.不要指定
SubjectId
列。3.尝试只使用约定。我没有实时模型或DB来运行此响应gainst,因此在我第一次创建模型时,EF生成缺少的元素。
public class FaceImage
{
    ...

    [Required]
    public virtual Subject Subject { get; set; }
}

public class KVPair
{
    ...

    [Required]
    public virtual Subject Subject { get; set; }
}
    modelBuilder.Entity<Subject>().HasMany(x => x.KeyValues).WithRequired(x => x.Subject).WillCascadeOnDelete(true);
    modelBuilder.Entity<Subject>().HasRequired(x => x.EnrolledFace).WithRequiredPrincipal(x => x.Subject).WillCascadeOnDelete(true);
public class FaceImage
{
    ...

    [Required]
    public Guid SubjectId { get; set; }

    [ForeignKey(nameof(SubjectId))]
    public virtual Subject Subject { get; set; }
}

public class KVPair
{
    ...

    [Required]
    public Guid SubjectId { get; set; }

    [ForeignKey(nameof(SubjectId))]
    public virtual Subject Subject { get; set; }
}