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; }
}