akn*_*ds1 4 entity-framework ef-code-first ef-migrations entity-framework-5
我想弄清楚如何用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; }
}
Run Code Online (Sandbox Code Playgroud)
但是,当尝试通过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.
Run Code Online (Sandbox Code Playgroud)
关于如何解决这个问题的建议将非常受欢迎.
经过一些谷歌搜索,我设法在SO上找到了一个类似的问题,那里有一个解决方案,至少可以毫无问题地进入数据库.
基本上,我将每个用户的外键添加到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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
936 次 |
| 最近记录: |