我有一个具有多个流派的视频实体,
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的类型集合中删除流派然后更新()类型。这种方法似乎浪费了数据库。缓存是否意味着只有一次旅行,任何删除都会被删除?
答案 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。