2009-05-30 90 views
4

我在ASP.NET MVC中使用Ado.Net实体框架。ADO.NET实体框架:如何获取自动级联删除?

在我MSSQL 2008数据库我有例如下面的简化表和关系:

(Song) 1--* (Version) 1 -- 1 (VersionInfo) 

是否有可能自动具有链接的版本及其VERSIONINFO的,当我删除歌曲删除?

目前我使用类似下面的代码,这是一个很大的体力劳动,因为某些表有多达8间的关系,这些关系有subrelations有时也:

db = new Database() //Entities 
    Song song = db.Song.First(); 

    Song.Version.Load(); 

    foreach(Version version in Song.Version.ToList()) 
    { 
     //Remove Song-Version Reference. 
     song.Version.Remove(version); 


     //Get The VersionInfo so we can delete it after we deleted the Version object. 
     version.VersionInfoReference.Load(); 
     VersionInfo versionInfo = version.VersionInfo; 

     //Now we can delete the Version Object. 
     db.DeleteObject(version); 
     //Now we can also delete the versionInfo, since the reference is gone. 
     db.DeleteObject(versionInfo); 

    } 

    db.DeleteObject(song); 

必须有一个更简单方式来获取级联删除。我已经尝试在删除时将MSSQL中的关系设置设置为级联,但它没有做到......我错过了那里的某些东西吗?

无论如何,其他人怎么解决这个问题呢?

回答

2

你不应该在实体框架中这样做。所有流行的关系数据库都支持外键ON CASCADE DELETE,效率更高。我建议你就这样做。

它出现在你的情况下,你可能不得不级联删除歌曲版本和删除版本信息。只需加载SQL管理器中的表设计器,您应该看到关系下的相关选项。

0

如果您在数据库中正确设置它,那么它肯定应该级联删除。我认为他们在实体框架的下一个版本中改进了这一点,但我不确定。我只记得在某处看到级联。我建议你再看看数据库。

例如,还有其他关系还需要级联吗?

1

我试着用一个更简单的数据库,2个表,并发现级联只是从1多边的一侧。

table A 
id - int 
b_id - int 

table B 
id - int 

关系在A.b_id和B.id之间设置。 删除规则是级联的。

当我删除A时,B不会被删除。 当我删除B时,A被删除。

问题是,我想B删除时,我删除A.我想这只能手动。

+0

是的。如果删除A,则B仍然可以不存在任何问题。但是如果你删除B,那么A就不能存在(因为它指向B,它不再存在)。仅当删除项目(B)导致其他项目(A)不正确或违反外键约束时,级联删除才会发生。 – Flater 2012-06-28 10:54:32

0

在EF的RTM中,在设计器中选择一个关系,按F4查看属性。您会看到两个OnDelete属性(关系的每一边都有一个)设置为“无”。你可以设置任何一方“级联”(我认为你必须将它设置在父级)