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()
。它只将对象加载到上下文中,而不将对象返回到列表变量。