Entity framework 4 EF代码首先给出外键中的问题 公共类ParikshaContext:DbContext { 公共ParikshaContext() { SetInitializer(新的DropCreateDatabaseIfModelChanges()); } 公共DbSet UserDetails{get;set;} 公共数据库集标准{get;set;} 公共数据库集主题{get;set;} 公共数据库集问题描述符{get;set;} 公共数据库集问题摘要{get;set;} 公共数据库集{get;set;} 公共数据库集选项{get;set;} 公共数据库集匹配{get;set;} 公共数据库集测试{get;set;} 公共数据库集测试题{get;set;} 模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder) { modelBuilder.Entity().ToTable(“自定义”); modelBuilder.Entity().ToTable(“简短”); modelBuilder.Entity().ToTable(“匹配”); modelBuilder.Entity().ToTable(“选择”); } } 公共类问题描述符 { public int QuestionDescriptorId{get;set;} 公共int标准ID{get;set;} [外键(“标准ID”)] 公共虚拟标准{get;set;} public int SubjectId{get;set;} [外键(“主体”)] 公共虚拟主题主题{get;set;} 公共整数评级{get;set;} 公共整数{get;set;} 创建的公共日期时间日期{get;set;} public int UserDetailId{get;set;} [ForeignKeyAttribute(“UserDetailId”)] 公共虚拟用户详细信息创建者{get;set;} } 公共类问题简介:QuestionDescriptor { 公共字符串QuestionText{get;set;} 公共字符串答案{get;set;} //正确表示填空,错误表示查找答案 公共布尔短{get;set;} } 公共类标准 { 公共int标准ID{get;set;} 公共字符串StandardName{get;set;} } 公共课科目 { public int SubjectId{get;set;} 公共字符串SubjectName{get;set;} 公共字符串SubjectCategory{get;set;} //公共int标准ID{get;set;} //[外键(“标准ID”)] //公共虚拟标准{get;set;} } 公开课考试 { 公共int TestID{get;set;} 创建的公共日期时间日期{get;set;} 公共字符串StandardName{get;set;} 公共字符串SubjectName{get;set;} 公共字符串SubjectCategory{get;set;} //public int UserDetailId{get;set;} //[ForeignKey(“UserDetailId”)] //公共虚拟用户详细信息创建者{get;set;} } 公开课试题 { 公共int测试_QuestionID{get;set;} 公共int TestId{get;set;} [外键(“TestId”)] 公共虚拟测试测试{get;set;} public int QuestionDescriptorId{get;set;} [外键(“问题描述符”)] 公共虚拟问题描述符问题{get;set;} } 公共类用户详细信息 { public int UserDetailId{get;set;} [必需] [MaxLength(10,ErrorMessage=“用户名必须小于等于10个字符”)、MinLength(5)] 公共字符串名称{get;set;} [必需] 公共字符串密码{get;set;} 公共字符串用户角色{get;set;} 创建的公共日期时间日期{get;set;} } //Match、Custom和Choice类由于缺少空间而被省略(当我看到粘贴的代码数量时,这听起来很愚蠢)

Entity framework 4 EF代码首先给出外键中的问题 公共类ParikshaContext:DbContext { 公共ParikshaContext() { SetInitializer(新的DropCreateDatabaseIfModelChanges()); } 公共DbSet UserDetails{get;set;} 公共数据库集标准{get;set;} 公共数据库集主题{get;set;} 公共数据库集问题描述符{get;set;} 公共数据库集问题摘要{get;set;} 公共数据库集{get;set;} 公共数据库集选项{get;set;} 公共数据库集匹配{get;set;} 公共数据库集测试{get;set;} 公共数据库集测试题{get;set;} 模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder) { modelBuilder.Entity().ToTable(“自定义”); modelBuilder.Entity().ToTable(“简短”); modelBuilder.Entity().ToTable(“匹配”); modelBuilder.Entity().ToTable(“选择”); } } 公共类问题描述符 { public int QuestionDescriptorId{get;set;} 公共int标准ID{get;set;} [外键(“标准ID”)] 公共虚拟标准{get;set;} public int SubjectId{get;set;} [外键(“主体”)] 公共虚拟主题主题{get;set;} 公共整数评级{get;set;} 公共整数{get;set;} 创建的公共日期时间日期{get;set;} public int UserDetailId{get;set;} [ForeignKeyAttribute(“UserDetailId”)] 公共虚拟用户详细信息创建者{get;set;} } 公共类问题简介:QuestionDescriptor { 公共字符串QuestionText{get;set;} 公共字符串答案{get;set;} //正确表示填空,错误表示查找答案 公共布尔短{get;set;} } 公共类标准 { 公共int标准ID{get;set;} 公共字符串StandardName{get;set;} } 公共课科目 { public int SubjectId{get;set;} 公共字符串SubjectName{get;set;} 公共字符串SubjectCategory{get;set;} //公共int标准ID{get;set;} //[外键(“标准ID”)] //公共虚拟标准{get;set;} } 公开课考试 { 公共int TestID{get;set;} 创建的公共日期时间日期{get;set;} 公共字符串StandardName{get;set;} 公共字符串SubjectName{get;set;} 公共字符串SubjectCategory{get;set;} //public int UserDetailId{get;set;} //[ForeignKey(“UserDetailId”)] //公共虚拟用户详细信息创建者{get;set;} } 公开课试题 { 公共int测试_QuestionID{get;set;} 公共int TestId{get;set;} [外键(“TestId”)] 公共虚拟测试测试{get;set;} public int QuestionDescriptorId{get;set;} [外键(“问题描述符”)] 公共虚拟问题描述符问题{get;set;} } 公共类用户详细信息 { public int UserDetailId{get;set;} [必需] [MaxLength(10,ErrorMessage=“用户名必须小于等于10个字符”)、MinLength(5)] 公共字符串名称{get;set;} [必需] 公共字符串密码{get;set;} 公共字符串用户角色{get;set;} 创建的公共日期时间日期{get;set;} } //Match、Custom和Choice类由于缺少空间而被省略(当我看到粘贴的代码数量时,这听起来很愚蠢),entity-framework-4,ef-code-first,Entity Framework 4,Ef Code First,我有两个问题:- 我无法获得标准和主题之间的外键关系,它表示该关系将导致多个级联删除路径 如果我在test和usedetail之间进行外键映射,它会给我上述映射tst_问题表的问题 另外,由于我是EF代码的新手,请指出我的错误。欢迎所有帮助和讨论 默认情况下,EF将创建外键,并将级联删除。在您的模型中,如果删除标准,则有多个路径可删除问题描述符 标准->问题描述符 及 标准->主题->问题描述符 这就是SQL server不允许您这样做的原因。看 您可以做的是明确地告诉EF创建外键,而不使用ca

我有两个问题:-

  • 我无法获得标准和主题之间的外键关系,它表示该关系将导致多个级联删除路径

  • 如果我在test和usedetail之间进行外键映射,它会给我上述映射tst_问题表的问题


  • 另外,由于我是EF代码的新手,请指出我的错误。欢迎所有帮助和讨论

    默认情况下,EF将创建外键,并将
    级联删除
    。在您的模型中,如果删除
    标准
    ,则有多个路径可删除
    问题描述符

    标准->问题描述符

    标准->主题->问题描述符

    这就是SQL server不允许您这样做的原因。看

    您可以做的是明确地告诉EF创建外键,而不使用
    cascade delete
    但这可能会造成数据完整性问题。因此,请确保您了解后果。

    您可以使用fluent API和
    WillCascadeOnDelete(false)
    配置关系

    模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
    {
    //其他映射
    modelBuilder.Entity()
    .HasRequired(subject=>subject.Standard).WithMany()
    .HasForeignKey(subject=>subject.StandardId)
    .WillCascadeOnDelete(假);
    }
    
    非常感谢您的帮助。我希望标准和主题之间的外键也可以层叠,因为主题依赖于标准。我不能有多个路径,因为我在那里看不到任何循环吗?@ashutosh然后配置
    standard->QuestionDescriptor
    ,而不层叠。您可能需要添加一个触发器来执行删除操作。尝试适合你的方法。是的……我同意你的看法。你认为如果我把所有的映射逻辑分开,使用fluent api而不是注释会更好吗?@ashutosh这两种方法都有优点和缺点。基于属性的配置非常有限。我将使用fluentapi进行映射。
    public class ParikshaContext :DbContext
    {
        public ParikshaContext()
        {
    
           Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ParikshaContext>());
    
        }
        public DbSet<UserDetail> UserDetails { get; set; }
        public DbSet<Standard> Standards { get; set; }
        public DbSet<Subject> Subjects { get; set; }
        public DbSet<QuestionDescriptor> QuestionDescriptors { get; set; }
        public DbSet<QuestionBrief> QuestionBriefs { get; set; }
        public DbSet<QuestionCustom> QuestionCustoms { get; set; }
        public DbSet<QuestionChoice> QuestionChoices { get; set; }
        public DbSet<QuestionMatch> QuestionMatches { get; set; }
        public DbSet<Test> Tests { get; set; }
        public DbSet<Test_Question> Test_Questions { get; set; }
    
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            modelBuilder.Entity<QuestionCustom>().ToTable("Custom");
            modelBuilder.Entity<QuestionBrief>().ToTable("Brief");
            modelBuilder.Entity<QuestionMatch>().ToTable("Match");
            modelBuilder.Entity<QuestionChoice>().ToTable("Choice");
        }       
    } 
    
    public class QuestionDescriptor
    {
    
        public int QuestionDescriptorId { get; set; } 
    
        public int StandardId { get; set; }
        [ForeignKey("StandardId")]
        public virtual Standard Standard { get; set; }
    
        public int SubjectId { get; set; }
        [ForeignKey("SubjectId")]
        public virtual Subject Subject { get; set; }
    
        public int Rating { get; set; }
        public int Difficulty { get; set; }
    
        public DateTime DateOfCreation{get;set;}
    
        public int UserDetailId { get; set; }     
        [ForeignKeyAttribute("UserDetailId")]
        public virtual UserDetail Creator { get; set; }
    
    }
    
    public class QuestionBrief : QuestionDescriptor
    {
        public String QuestionText { get; set; }
        public String Answer { get; set; }
        //true for fill in the blanks and false for a loing answers
        public bool Short { get; set; }
    }
    
    public class Standard
    {
        public int StandardId { get; set; }
        public String StandardName { get; set; }
    
    }
    
    public class Subject
    {
        public int SubjectId { get; set; }
        public String SubjectName { get; set; }
        public String SubjectCategory { get; set; }        
    
      //  public int StandardId { get; set; }
      //  [ForeignKey("StandardId")]
       // public virtual Standard Standard { get; set; }
    }
    
    public class Test
    {
    
        public int TestID { get; set; }
        public DateTime DateOfCreation { get; set; }    
    
        public String StandardName { get; set; }
        public String SubjectName { get; set; }
        public String SubjectCategory { get; set; }
    
    //    public int UserDetailId { get; set; }
    //    [ForeignKey("UserDetailId")]
     //   public virtual UserDetail Creator { get; set; }
    
    
    }
    
    public class Test_Question
    {
    
        public int Test_QuestionID { get; set; }     
    
        public int TestId { get; set; }
        [ForeignKey("TestId")]
        public virtual Test Test { get; set; }
    
        public int QuestionDescriptorId { get; set; }
        [ForeignKey("QuestionDescriptorId")]
        public virtual QuestionDescriptor Question { get; set; }
    }
    
    public class UserDetail
    {
    
        public int UserDetailId { get; set; }
    
        [Required]
        [MaxLength(10, ErrorMessage = "UserName must be 10 characters or less"), MinLength(5)]
        public String Name { get; set; }
    
        [Required]        
        public String Password { get; set; }
        public String UserRole { get; set; }
        public DateTime DateOfCreation{  get; set;}    
    }
    
    //Match,Custom,Choice classes have been omitted for lack of space (which sounds stupid when i look at the amount of code i have pasted )
    
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
      //other mappings
    
          modelBuilder.Entity<Subject>()
            .HasRequired(subject => subject.Standard).WithMany()
            .HasForeignKey(subject => subject.StandardId)
            .WillCascadeOnDelete(false);
    }