You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
241 lines
6.4 KiB
C#
241 lines
6.4 KiB
C#
// Licensed to the .NET Foundation under one or more agreements.
|
|
// The .NET Foundation licenses this file to you under the MIT license.
|
|
|
|
using EntityFrameworkCore.Jet.FunctionalTests.TestUtilities;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore.BulkUpdates;
|
|
using Microsoft.EntityFrameworkCore.TestUtilities;
|
|
using System;
|
|
using System.Threading.Tasks;
|
|
using Xunit;
|
|
using Xunit.Abstractions;
|
|
|
|
namespace EntityFrameworkCore.Jet.FunctionalTests.BulkUpdates;
|
|
|
|
public class NonSharedModelBulkUpdatesJetTest(NonSharedFixture fixture) : NonSharedModelBulkUpdatesRelationalTestBase(fixture)
|
|
{
|
|
protected override ITestStoreFactory TestStoreFactory
|
|
=> JetTestStoreFactory.Instance;
|
|
|
|
[ConditionalFact]
|
|
public virtual void Check_all_tests_overridden()
|
|
=> TestHelpers.AssertAllMethodsOverridden(GetType());
|
|
|
|
public override async Task Delete_aggregate_root_when_eager_loaded_owned_collection(bool async)
|
|
{
|
|
await base.Delete_aggregate_root_when_eager_loaded_owned_collection(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
DELETE FROM `Owner` AS `o`
|
|
""");
|
|
}
|
|
|
|
public override async Task Delete_with_owned_collection_and_non_natively_translatable_query(bool async)
|
|
{
|
|
await base.Delete_with_owned_collection_and_non_natively_translatable_query(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
@__p_0='1'
|
|
|
|
DELETE FROM [o]
|
|
FROM [Owner] AS [o]
|
|
WHERE [o].[Id] IN (
|
|
SELECT [o0].[Id]
|
|
FROM [Owner] AS [o0]
|
|
ORDER BY [o0].[Title]
|
|
OFFSET @__p_0 ROWS
|
|
)
|
|
""");
|
|
}
|
|
|
|
public override async Task Delete_aggregate_root_when_table_sharing_with_owned(bool async)
|
|
{
|
|
await base.Delete_aggregate_root_when_table_sharing_with_owned(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
DELETE FROM `Owner` AS `o`
|
|
""");
|
|
}
|
|
|
|
public override async Task Delete_aggregate_root_when_table_sharing_with_non_owned_throws(bool async)
|
|
{
|
|
await base.Delete_aggregate_root_when_table_sharing_with_non_owned_throws(async);
|
|
|
|
AssertSql();
|
|
}
|
|
|
|
public override async Task Replace_ColumnExpression_in_column_setter(bool async)
|
|
{
|
|
await base.Replace_ColumnExpression_in_column_setter(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
@p='SomeValue' (Size = 255)
|
|
|
|
UPDATE `Owner` AS `o`
|
|
INNER JOIN `OwnedCollection` AS `o0` ON `o`.`Id` = `o0`.`OwnerId`
|
|
SET `o0`.`Value` = @p
|
|
""");
|
|
}
|
|
|
|
public override async Task Update_non_owned_property_on_entity_with_owned(bool async)
|
|
{
|
|
await base.Update_non_owned_property_on_entity_with_owned(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
@p='SomeValue' (Size = 255)
|
|
|
|
UPDATE `Owner` AS `o`
|
|
SET `o`.`Title` = @p
|
|
""");
|
|
}
|
|
|
|
public override async Task Update_non_owned_property_on_entity_with_owned2(bool async)
|
|
{
|
|
await base.Update_non_owned_property_on_entity_with_owned2(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
UPDATE `Owner` AS `o`
|
|
SET `o`.`Title` = IIF(`o`.`Title` IS NULL, '', `o`.`Title`) & '_Suffix'
|
|
""");
|
|
}
|
|
|
|
public override async Task Update_non_owned_property_on_entity_with_owned_in_join(bool async)
|
|
{
|
|
await base.Update_non_owned_property_on_entity_with_owned_in_join(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
@p='NewValue' (Size = 255)
|
|
|
|
UPDATE `Owner` AS `o`
|
|
INNER JOIN `Owner` AS `o0` ON `o`.`Id` = `o0`.`Id`
|
|
SET `o`.`Title` = @p
|
|
""");
|
|
}
|
|
|
|
public override async Task Update_owned_and_non_owned_properties_with_table_sharing(bool async)
|
|
{
|
|
await base.Update_owned_and_non_owned_properties_with_table_sharing(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
UPDATE `Owner` AS `o`
|
|
SET `o`.`Title` = IIF((`o`.`OwnedReference_Number` & '') IS NULL, '', (`o`.`OwnedReference_Number` & '')),
|
|
`o`.`OwnedReference_Number` = IIF(LEN(`o`.`Title`) IS NULL, NULL, CLNG(LEN(`o`.`Title`)))
|
|
""");
|
|
}
|
|
|
|
public override async Task Update_main_table_in_entity_with_entity_splitting(bool async)
|
|
{
|
|
await base.Update_main_table_in_entity_with_entity_splitting(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
UPDATE `Blogs` AS `b`
|
|
SET `b`.`CreationTimestamp` = #2020-01-01#
|
|
""");
|
|
}
|
|
|
|
public override async Task Update_non_main_table_in_entity_with_entity_splitting(bool async)
|
|
{
|
|
await base.Update_non_main_table_in_entity_with_entity_splitting(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
UPDATE `Blogs` AS `b`
|
|
INNER JOIN `BlogsPart1` AS `b0` ON `b`.`Id` = `b0`.`Id`
|
|
SET `b0`.`Title` = (`b0`.`Rating` & ''),
|
|
`b0`.`Rating` = IIF(LEN(`b0`.`Title`) IS NULL, NULL, CLNG(LEN(`b0`.`Title`)))
|
|
""");
|
|
}
|
|
|
|
public override async Task Delete_entity_with_auto_include(bool async)
|
|
{
|
|
await base.Delete_entity_with_auto_include(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
DELETE FROM `Context30572_Principal` AS `c`
|
|
WHERE `c`.`Id` IN (
|
|
SELECT `c0`.`Id`
|
|
FROM `Context30572_Principal` AS `c0`
|
|
LEFT JOIN `Context30572_Dependent` AS `c1` ON `c0`.`DependentId` = `c1`.`Id`
|
|
)
|
|
""");
|
|
}
|
|
|
|
public override async Task Delete_predicate_based_on_optional_navigation(bool async)
|
|
{
|
|
await base.Delete_predicate_based_on_optional_navigation(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
DELETE FROM `Posts` AS `p`
|
|
WHERE `p`.`Id` IN (
|
|
SELECT `p0`.`Id`
|
|
FROM `Posts` AS `p0`
|
|
LEFT JOIN `Blogs` AS `b` ON `p0`.`BlogId` = `b`.`Id`
|
|
WHERE `b`.`Title` LIKE 'Arthur%'
|
|
)
|
|
""");
|
|
}
|
|
|
|
public override async Task Update_with_alias_uniquification_in_setter_subquery(bool async)
|
|
{
|
|
await base.Update_with_alias_uniquification_in_setter_subquery(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
UPDATE [o]
|
|
SET [o].[Total] = (
|
|
SELECT COALESCE(SUM([o0].[Amount]), 0)
|
|
FROM [OrderProduct] AS [o0]
|
|
WHERE [o].[Id] = [o0].[OrderId])
|
|
FROM [Orders] AS [o]
|
|
WHERE [o].[Id] = 1
|
|
""");
|
|
}
|
|
|
|
public override async Task Delete_with_view_mapping(bool async)
|
|
{
|
|
await base.Delete_with_view_mapping(async);
|
|
|
|
AssertSql(
|
|
"""
|
|
DELETE FROM `Blogs` AS `b`
|
|
""");
|
|
}
|
|
|
|
public override async Task Update_with_view_mapping(bool async)
|
|
{
|
|
await base.Update_with_view_mapping(async);
|
|
AssertSql(
|
|
"""
|
|
@p='Updated' (Size = 255)
|
|
|
|
UPDATE `Blogs` AS `b`
|
|
SET `b`.`Data` = @p
|
|
""");
|
|
}
|
|
|
|
public override async Task Update_complex_type_with_view_mapping(bool async)
|
|
{
|
|
await base.Update_complex_type_with_view_mapping(async);
|
|
|
|
// #34706
|
|
AssertSql();
|
|
}
|
|
|
|
private void AssertSql(params string[] expected)
|
|
=> TestSqlLoggerFactory.AssertBaseline(expected);
|
|
|
|
private void AssertExecuteUpdateSql(params string[] expected)
|
|
=> TestSqlLoggerFactory.AssertBaseline(expected, forUpdate: true);
|
|
}
|