使用NHibernate删除给定列表中不存在的记录

时间:2010-09-27 01:58:29

标签: c# nhibernate

我有一个具有多个流派的视频实体,

public class Video 
{
    public int Id { get; set; }
    // other fields omitted for brevity
    public IList<Genre> Genres { get; set; }
}

public class Genre 
{
    public int Id { get; set; }
    public string Name { get; set; }
    // fields omitted for brevity
}

最初,我从一个包含所有流派和每个类型的视频的xml文件中填充视频实体及其类型(视频可能会出现多次,在不同的流派下)。

我需要定期刷新我的视频副本,这意味着我需要删除所有不再映射到特定类型的视频。在例行程序中,我将只有一个当前映射的视频到流派的列表,但我需要打破视频和流派之间的链接,以便不再映射。

在原始Sql中我可以说:

DELETE FROM VideoGenre WHERE GenreId=@GenreId AND VideoID NOT IN (@VideoIdList)

其中VideoIdList可能是“1,2,3,4,5,6”。

如何使用NHibernate完成同样的事情?我应该使用HQL还是原始SQL?

另一种方法可能是检索所有与VideoIdList不匹配的视频(我希望这个列表几乎总是空的 - 视频不经常改变类型:))然后从每个Video的类型集合中删除流派然后更新()类型。这种方法似乎浪费了数据库。缓存是否意味着只有一次旅行,任何删除都会被删除?

1 个答案:

答案 0 :(得分:2)

如下:

var genreId = 25;
var videos = new int[] { 1, 2, 3, 4, 5 };

session.CreateQuery("DELETE FROM VideoGenre vg WHERE vg.GenreId=:genreId AND vg.VideoID NOT IN (:videos)")
       .SetParameter("genreId", genreId)
       .SetParameterList("videos", videos)
       .ExecuteUpdate();

更多信息here