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
另外,由于我是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);
}