EF6 Code First - 可能会导致周期或多个级联路径 [英] EF6 Code First - may cause cycles or multiple cascade paths

查看:129
本文介绍了EF6 Code First - 可能会导致周期或多个级联路径的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是EF6 Code First。
我有两个类:

  public class Player 
{
[DatabaseGeneratedAttribute(DatabaseGeneratedOption。身份)]
[Key]
public int Id {get;组; }

[必需,最小长度(2,ErrorMessage =播放器名称必须至少2个字符长度)]
public string Name {get;组;

[必需]
public int TeamClubId {get;组;

[必需]
public int TeamNationalId {get;组; }

[必需,ForeignKey(TeamClubId)]
public virtual Team Club {get;组; }

[必需,ForeignKey(TeamNationalId)]
public virtual Team National {get;组;

}

And:

  public class Team 
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id {get;组; }

[必需,最小长度(2,ErrorMessage =团队名称必须至少2个字符长度)]
public string Name {get;组;

[必需]
public TeamType Type {get;组; }

public virtual ICollection< Player>玩家{get;组; }
}

这是我们两个关系的班级。
玩家属于两支球队:俱乐部和国家队。
一个团队可以是俱乐部还是国家队,并持有一组球员。



在我的上下文文件中,我使用:

  protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity< Player>()
.HasRequired< Team> (p => p.National)
.WithMany(t => t.Players)
.WillCascadeOnDelete(false);

base.OnModelCreating(modelBuilder);
}

当运行迁移工具更新数据库时,我收到以下错误:



引入FOREIGN KEY约束表上的FK_dbo.Players_dbo.Teams_TeamNationalId可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。
无法创建约束。查看以前的错误。



如何解决?

解决方案

使用Fluent API:

  //播放器 - 国家队关系
modelBuilder.Entity< Player>()
。HasRequired< Team>(p => p.National)
.WithMany()
.WillCascadeOnDelete(false);

//播放器 - 俱乐部团队关系
modelBuilder.Entity< Player>()
.HasRequired< Team>(p => p.Club)
。 WithMany()
.WillCascadeOnDelete(false);


I'm using EF6 Code First. I have two classes:

public class Player
{
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    [Key]
    public int Id { get; set; }

    [Required, MinLength(2, ErrorMessage = "Player name must be at least 2 characters length")]
    public string Name { get; set; }

    [Required]
    public int TeamClubId { get; set; }

    [Required]
    public int TeamNationalId { get; set; }

    [Required, ForeignKey("TeamClubId")]
    public virtual Team Club { get; set; }

    [Required, ForeignKey("TeamNationalId")]
    public virtual Team National { get; set; }

}

And:

 public class Team
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }

    [Required, MinLength(2, ErrorMessage = "Team name must be at least 2 characters length")]
    public string Name { get; set; }

    [Required]
    public TeamType Type { get; set; }

    public virtual ICollection<Player> Players { get; set; }
}

These are my two class with their relationship. A player belongs to two teams: club and national teams. A team can be either club or national, and holds a collection of player.

In my context file I use:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Player>()
                .HasRequired<Team>(p => p.National)
                .WithMany(t => t.Players)
                .WillCascadeOnDelete(false);

        base.OnModelCreating(modelBuilder);
    }

When running the migration tool to update the database, I get the following error:

Introducing FOREIGN KEY constraint 'FK_dbo.Players_dbo.Teams_TeamNationalId' on table 'Players' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. Could not create constraint. See previous errors.

How do I solve it?

解决方案

Using Fluent API:

        //player - national team relations
        modelBuilder.Entity<Player>()
            .HasRequired<Team>(p => p.National)
            .WithMany()
            .WillCascadeOnDelete(false);

        //player - club team relations
        modelBuilder.Entity<Player>()
            .HasRequired<Team>(p => p.Club)
            .WithMany()
            .WillCascadeOnDelete(false);

这篇关于EF6 Code First - 可能会导致周期或多个级联路径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆