Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework EF 4.1具有两种关系的实体之间的双向级联_Entity Framework_Entity Relationship - Fatal编程技术网

Entity framework EF 4.1具有两种关系的实体之间的双向级联

Entity framework EF 4.1具有两种关系的实体之间的双向级联,entity-framework,entity-relationship,Entity Framework,Entity Relationship,我有以下两个实体: public class Tournament { public int TournamentID { get; set; } public String Name { get; set; } public int? OfficialID { get; set; } public virtual Official HeadOfficial { get; set; } public virtual ICollection<Off

我有以下两个实体:

public class Tournament {
    public int TournamentID { get; set; }
    public String Name { get; set; }
    public int? OfficialID { get; set; }

    public virtual Official HeadOfficial { get; set; }

    public virtual ICollection<Official> Officials { get; set; }
}

public class Official {
    public int OfficialID { get; set; }
    public String Surname { get; set; }
    public String FirstName { get; set; }
    public int TournamentID { get; set; }

    public virtual Tournament Tournament { get; set; }
}
公开课比赛{
公共int TournamentID{get;set;}
公共字符串名称{get;set;}
public int?OfficialID{get;set;}
公共虚拟官员负责人{get;set;}
公共虚拟ICollection{get;set;}
}
公职人员{
public int OfficialID{get;set;}
公共字符串姓氏{get;set;}
公共字符串名{get;set;}
公共int TournamentID{get;set;}
公开虚拟锦标赛{get;set;}
}
一个锦标赛可以有0..N名官员,一名官员必须有一个锦标赛链接到它。第二种关系是,锦标赛可能有一位总干事

为了使EF在创建数据库时正确地解释这一点,我有以下几点:

    protected override void  OnModelCreating(DbModelBuilder modelBuilder) {
        modelBuilder.Entity<Tournament>()
            .HasOptional(t => t.HeadOfficial)
            .WithMany()
            .HasForeignKey(t => t.OfficialID);

        modelBuilder.Entity<Tournament>()
            .HasMany(t => t.Officials)
            .WithRequired(o => o.Tournament)
            .HasForeignKey(o => o.TournamentID);        
    }
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder){
modelBuilder.Entity()
.has可选(t=>t.HeadOfficial)
.有很多
.HasForeignKey(t=>t.OfficialID);
modelBuilder.Entity()
.HasMany(t=>t.officers)
.WithRequired(o=>o
.HasForeignKey(o=>o.TournamentID);
}
如果我现在删除一项赛事,所有与该赛事相关的官员都会被删除,这就是我想要的。但是,当我删除一个在其中一个锦标赛中被任命为首席官员的官员时,删除并不会引用delete语句与tournaments.OfficialID中的引用约束冲突

如果我现在删除一项赛事,所有与之相关的官员 那场比赛被删除了,这就是我想要的。然而,当我 删除一名已在其中一个 比赛,删除不经过引用,删除 语句与中的引用约束冲突 比赛,官方的

我认为这是完全不同的情况。第一种情况之所以有效,是因为数据库中存在级联删除设置(EF确实在数据库中创建了此规则,因为关系是必需的,这是默认行为)

第二个关系是可选的,因此默认情况下没有级联删除。更重要的是:我不认为你想要级联删除,因为这意味着删除一名官员也会删除以该官员为负责人的比赛

我只能想象,如果官员被删除,您希望将
HeadOfficial
引用设置为
null
。但没有自动方式(如级联删除)。您必须对此类行为进行编程,例如:

using (var ctx = new MyContext())
{
    var officialToDelete = ctx.Officials.Single(o => o.OfficialID == 5);
    var tournaments = ctx.Tournaments.Where(t => t.OfficialID == 5).ToList();

    foreach (var tournament in tournaments)
        tournament.OfficialID = null;

    ctx.Officials.Remove(officialToDelete);

    ctx.SaveChanges();
}

我认为,
foreach
循环是不必要的,因为在调用
Remove
时,EF将修复关系(=将外键设置为
null
)。(基本上EF本身在内部执行此循环。)但将锦标赛加载到上下文中很重要,因为EF关心的是此关系修复(仅针对附加(=加载的)实体),而不是数据库(与级联删除相反)。

你说得对。当我试图在SMS中删除它时,EF当然没有办法为我解决这个问题。一旦我在代码中测试了它,它就可以工作,而不必添加foreach循环。再次感谢。@pEkvo:BTW:如果它在没有foreach循环的情况下工作,那么您可以丢弃
tournaments
变量,并将代码稍微简化为:
ctx.tournaments.Where(t=>t.OfficialID==5.Load()
。它只将对象加载到上下文中,而不将对象返回到列表变量。