我想弄清楚如何用Entity Framework(5)Code First来表示用户之间的友谊。我最初的想法是创建一个友谊类,其中包含对两个User实例的引用,以便友谊由不同的对象表示。
public class Friendship
{
public virtual int Id { get; set; }
[Required]
public virtual UserProfile User1 { get; set; }
[Required]
public virtual UserProfile User2 { get; set; }
[Required]
public virtual DateTime Since { get; set; }
}
[Table("UserProfile")]
public class UserProfile
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int UserId { get; set; }
[Required]
public string UserName { get; set; }
}
但是,尝试通过EF迁移创建数据库时,由于SQL错误,我感到难过:
Introducing FOREIGN KEY constraint 'FK_dbo.Friendships_dbo.UserProfile_User2_UserId' on table 'Friendships' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
非常欢迎有关如何解决这个问题的建议。
答案 0 :(得分:5)
我设法在谷歌上搜索了一个类似的问题之后再搜索一下,并且那里有一个解决方案,至少可以毫无问题地进入数据库。
基本上,我将每个用户的外键添加到Friendship
类,使它们成为复合主键,并将第二个外键配置为不在删除时级联。我最终使用了EF流畅的配置。
public class Friendship
{
public virtual int UserId1 { get; set; }
public virtual int UserId2 { get; set; }
public virtual User User1 { get; set; }
public virtual User User2 { get; set; }
public DateTime since;
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
...
modelBuilder.Entity<Friendship>().HasKey(f => new { f.UserId1, f.UserId2 });
modelBuilder.Entity<Friendship>()
.HasRequired(f => f.User1)
.WithMany()
.HasForeignKey(f => f.UserId1);
modelBuilder.Entity<Friendship>()
.HasRequired(f => f.User2)
.WithMany()
.HasForeignKey(f => f.UserId2)
.WillCascadeOnDelete(false);
}
答案 1 :(得分:0)
您可以自己定义外键或删除级联删除,具体取决于您的方案。请参阅此相关问题:Entity Framework Code First: FOREIGN KEY constraint may cause cycles or multiple cascade paths