我是EF代码第一校长的新手,目前还不知道该怎么做..我有2个POCO课程..
public class Problem
{
public int ProblemID { get; set; }
public int UserID { get; set; }
public int CategoryID { get; set; }
public int RatingID { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public double Latitude { get; set; }
public double Longitude { get; set; }
public int State { get; set; }
public DateTime CreatedOn { get; set; }
public virtual Rating Rating { get; set; }
public virtual Category Category { get; set; }
public virtual User User { get; set; }
public virtual ICollection<Picture> Pictures { get; set; }
public virtual ICollection<Comment> Comments { get; set; }
}
和
public class User
{
public int UserID { get; set; }
public int RoleID { get; set; }
public string Name { get; set; }
public string Surname { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public string SocialHandle { get; set; }
public DateTime RegisteredOn { get; set; }
public virtual Role Role { get; set; }
public virtual ICollection<Point> Points { get; set; }
public virtual ICollection<Problem> Problems { get; set; }
public virtual ICollection<Comment> Comments { get; set; }
}
我的数据库创建没问题,但是当我尝试使用自定义初始化程序在其中初始化一些数据时,我收到以下错误:
在表上引入FOREIGN KEY约束'Problem_User' “问题”可能导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY 限制。
无法创建约束。查看以前的错误。
这是我的初始化程序:
protected override void Seed(CleanStreets context)
{
var adminRole = new Role { Name = "Administrator", RoleID = 0 };
var moderatorRole = new Role { Name = "Moderator", RoleID = 1 };
var userRole = new Role { Name = "User", RoleID = 2 };
context.Roles.Add(adminRole);
context.Roles.Add(userRole);
context.Roles.Add(moderatorRole);
var admin = new User { Name = "admin", Surname = "admin", Role = adminRole, Email = "fake@fake.com", Password = "", RegisteredOn = DateTime.Now, SocialHandle = null };
var user = new User { Name = "user", Surname = "user", Role = userRole, Email = "fake@fake2.com", Password = "", RegisteredOn = DateTime.Now, SocialHandle = null };
context.Users.Add(admin);
context.Users.Add(user);
var categoryOne = new Category { Title = "Komunalni problemi", CategoryID = 0 };
var categoryTwo = new Category { Title = "Ostali problemi", CategoryID = 1 };
context.Categories.Add(categoryOne);
context.Categories.Add(categoryTwo);
var problem = new Problem { Category = categoryOne, Title = "Prvi testni problem", Description = "Ovo je testni opis", Latitude = 45.5, Longitude = 15.5, State = 0, CreatedOn = DateTime.Now, User = user };
context.Problems.Add(problem);
base.Seed(context);
}
我做错了什么?提前谢谢!
答案 0 :(得分:15)
那将是因为Comments
。默认情况下,EF使用引用上的级联删除。在您的情况下,将从User - &gt;创建级联删除。问题,用户 - &gt;评论但也来自问题 - &gt;评论。如果您删除用户级联到相同的评论记录,则可以来自Problem
和User
。这在SQL Server中是不允许的。每个记录只能通过单个级联删除路径访问。
要避免这种情况,您必须使用流畅的映射来关闭一个关系上的级联删除(您必须选择哪一个)。用户的示例 - &gt;评论
public class Context : DbContext
{
public DbSet<User> Users { get; set; }
public DbSet<Comment> Comments { get; set; }
public DbSet<Problem> Problems { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<User>()
.HasMany(u => u.Comments)
.HasRequired(c => c.User)
.HasForeignKey(c => c.UserId)
.WillCascadeOnDelete(false);
base.OnModelCreating(modelBuilder);
}
}
在您的模型中可能存在其他可能导致此问题的实体和关系,但Comment
在您的示例中显而易见。