From da20245be0a1d9fc79b6fc2b4cbfff2d13e8d830 Mon Sep 17 00:00:00 2001 From: Roman Artiukhin Date: Tue, 26 Feb 2019 18:29:31 +0200 Subject: [PATCH] Throw for LINQ DML on filter --- .../Async/LinqBulkManipulation/Fixture.cs | 14 +++++++++++++- .../LinqBulkManipulation/Fixture.cs | 14 +++++++++++++- src/NHibernate/Async/Linq/DefaultQueryProvider.cs | 3 +++ src/NHibernate/Linq/DefaultQueryProvider.cs | 3 +++ 4 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/NHibernate.Test/Async/LinqBulkManipulation/Fixture.cs b/src/NHibernate.Test/Async/LinqBulkManipulation/Fixture.cs index 6b8f7c84a12..5225995a081 100644 --- a/src/NHibernate.Test/Async/LinqBulkManipulation/Fixture.cs +++ b/src/NHibernate.Test/Async/LinqBulkManipulation/Fixture.cs @@ -1158,6 +1158,18 @@ public async Task DeleteSyntaxWithCompositeIdAsync() } } + [Test] + public async Task DeleteOnFilterThrowsAsync() + { + using (var s = OpenSession()) + using (s.BeginTransaction()) + { + var a = await (s.Query().Take(1).SingleOrDefaultAsync()); + var query = a.AssociatedEntities.AsQueryable(); + Assert.That(() => query.Delete(), Throws.InstanceOf()); + } + } + #endregion } -} \ No newline at end of file +} diff --git a/src/NHibernate.Test/LinqBulkManipulation/Fixture.cs b/src/NHibernate.Test/LinqBulkManipulation/Fixture.cs index 012ded4248e..d41510c4947 100644 --- a/src/NHibernate.Test/LinqBulkManipulation/Fixture.cs +++ b/src/NHibernate.Test/LinqBulkManipulation/Fixture.cs @@ -1199,6 +1199,18 @@ public void DeleteOnProjectionThrows() } } + [Test] + public void DeleteOnFilterThrows() + { + using (var s = OpenSession()) + using (s.BeginTransaction()) + { + var a = s.Query().Take(1).SingleOrDefault(); + var query = a.AssociatedEntities.AsQueryable(); + Assert.That(() => query.Delete(), Throws.InstanceOf()); + } + } + #endregion } -} \ No newline at end of file +} diff --git a/src/NHibernate/Async/Linq/DefaultQueryProvider.cs b/src/NHibernate/Async/Linq/DefaultQueryProvider.cs index f3c138f3511..d1e3549e354 100644 --- a/src/NHibernate/Async/Linq/DefaultQueryProvider.cs +++ b/src/NHibernate/Async/Linq/DefaultQueryProvider.cs @@ -73,12 +73,15 @@ protected virtual Task ExecuteQueryAsync(NhLinqExpression nhLinqExpressi public Task ExecuteDmlAsync(QueryMode queryMode, Expression expression, CancellationToken cancellationToken) { + if (Collection != null) + throw new NotSupportedException("DML operations are not supported for filters."); if (cancellationToken.IsCancellationRequested) { return Task.FromCanceled(cancellationToken); } try { + var nhLinqExpression = new NhLinqDmlExpression(queryMode, expression, Session.Factory); var query = Session.CreateQuery(nhLinqExpression); diff --git a/src/NHibernate/Linq/DefaultQueryProvider.cs b/src/NHibernate/Linq/DefaultQueryProvider.cs index dc53e318cc5..801399a5379 100644 --- a/src/NHibernate/Linq/DefaultQueryProvider.cs +++ b/src/NHibernate/Linq/DefaultQueryProvider.cs @@ -282,6 +282,9 @@ public virtual void SetResultTransformerAndAdditionalCriteria(IQuery query, NhLi public int ExecuteDml(QueryMode queryMode, Expression expression) { + if (Collection != null) + throw new NotSupportedException("DML operations are not supported for filters."); + var nhLinqExpression = new NhLinqDmlExpression(queryMode, expression, Session.Factory); var query = Session.CreateQuery(nhLinqExpression);