Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add end to end test for shared type entity type #21948

Merged
1 commit merged into from
Aug 6, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions src/EFCore/Internal/InternalDbSet.cs
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,15 @@ public override IEntityType EntityType
throw new InvalidOperationException(CoreStrings.InvalidSetTypeOwned(typeof(TEntity).ShortDisplayName()));
}

if (_entityType.ClrType != typeof(TEntity))
{
var message = CoreStrings.DbSetIncorrectGenericType(
_entityType.ShortName(), _entityType.ClrType.ShortDisplayName(), typeof(TEntity).ShortDisplayName());
_entityType = null;

throw new InvalidOperationException(message);
}

return _entityType;
}
}
Expand Down
8 changes: 8 additions & 0 deletions src/EFCore/Properties/CoreStrings.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions src/EFCore/Properties/CoreStrings.resx
Original file line number Diff line number Diff line change
Expand Up @@ -1489,4 +1489,7 @@
<value>Query uses a row limiting operation (Skip/Take) without OrderBy, which may lead to unpredictable results.</value>
<comment>Warning CoreEventId.RowLimitingOperationWithoutOrderByWarning</comment>
</data>
<data name="DbSetIncorrectGenericType" xml:space="preserve">
<value>Cannot create DbSet for entity type '{entityType}' since it is of type '{entityClrType}' but the generic type provided is of type '{genericType}'.</value>
</data>
</root>
119 changes: 80 additions & 39 deletions test/EFCore.Specification.Tests/ManyToManyTrackingTestBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,7 @@ public virtual void Can_insert_many_to_many_composite_with_navs()
ValidateFixup(context, leftEntities, rightEntities);
});

void ValidateFixup(DbContext context, IList<EntityCompositeKey> leftEntities, IList<EntityLeaf> rightEntities)
static void ValidateFixup(DbContext context, IList<EntityCompositeKey> leftEntities, IList<EntityLeaf> rightEntities)
{
Assert.Equal(11, context.ChangeTracker.Entries().Count());
Assert.Equal(3, context.ChangeTracker.Entries<EntityCompositeKey>().Count());
Expand Down Expand Up @@ -174,7 +174,7 @@ public virtual void Can_update_many_to_many_composite_with_navs()
ValidateFixup(context, leftEntities, rightEntities, 24, 8, 39 - 4);
});

void ValidateFixup(
static void ValidateFixup(
DbContext context,
List<EntityCompositeKey> leftEntities,
List<EntityLeaf> rightEntities,
Expand Down Expand Up @@ -331,7 +331,7 @@ public virtual void Can_delete_with_many_to_many_composite_with_navs()
|| e.Entity.LeafId == 23);
});

void ValidateNavigations(List<EntityCompositeKey> ones, List<EntityLeaf> threes)
static void ValidateNavigations(List<EntityCompositeKey> ones, List<EntityLeaf> threes)
{
foreach (var one in ones)
{
Expand Down Expand Up @@ -376,7 +376,7 @@ void ValidateNavigations(List<EntityCompositeKey> ones, List<EntityLeaf> threes)
}
}

void ValidateJoinNavigations(DbContext context)
static void ValidateJoinNavigations(DbContext context)
{
foreach (var joinEntity in context.ChangeTracker.Entries<JoinCompositeKeyToLeaf>().Select(e => e.Entity).ToList())
{
Expand Down Expand Up @@ -459,7 +459,7 @@ public virtual void Can_insert_many_to_many_composite_shared_with_navs()
ValidateFixup(context, leftEntities, rightEntities);
});

void ValidateFixup(DbContext context, IList<EntityCompositeKey> leftEntities, IList<EntityRoot> rightEntities)
static void ValidateFixup(DbContext context, IList<EntityCompositeKey> leftEntities, IList<EntityRoot> rightEntities)
{
Assert.Equal(11, context.ChangeTracker.Entries().Count());
Assert.Equal(3, context.ChangeTracker.Entries<EntityCompositeKey>().Count());
Expand Down Expand Up @@ -537,7 +537,7 @@ public virtual void Can_update_many_to_many_composite_shared_with_navs()
ValidateFixup(context, leftEntities, rightEntities, 24, 24, 47 - 4);
});

void ValidateFixup(
static void ValidateFixup(
DbContext context,
List<EntityCompositeKey> leftEntities,
List<EntityRoot> rightEntities,
Expand Down Expand Up @@ -589,7 +589,7 @@ void ValidateFixup(
}
}

var deleted = context.ChangeTracker.Entries<Dictionary<string, Object>>().Count(e => e.State == EntityState.Deleted);
var deleted = context.ChangeTracker.Entries<Dictionary<string, object>>().Count(e => e.State == EntityState.Deleted);
Assert.Equal(joinCount, (count / 2) + deleted);
}
}
Expand Down Expand Up @@ -665,7 +665,7 @@ public virtual void Can_delete_with_many_to_many_composite_shared_with_navs()
|| (int)e.Entity["RootId"] == 23);
});

void ValidateNavigations(List<EntityCompositeKey> ones, List<EntityRoot> threes)
static void ValidateNavigations(List<EntityCompositeKey> ones, List<EntityRoot> threes)
{
foreach (var one in ones)
{
Expand Down Expand Up @@ -757,7 +757,7 @@ public virtual void Can_insert_many_to_many_composite_additional_pk_with_navs()
ValidateFixup(context, leftEntities, rightEntities);
});

void ValidateFixup(DbContext context, IList<EntityCompositeKey> leftEntities, IList<EntityThree> rightEntities)
static void ValidateFixup(DbContext context, IList<EntityCompositeKey> leftEntities, IList<EntityThree> rightEntities)
{
var entries = context.ChangeTracker.Entries();
Assert.Equal(11, entries.Count());
Expand Down Expand Up @@ -848,7 +848,7 @@ public virtual void Can_update_many_to_many_composite_additional_pk_with_navs()
ValidateFixup(context, leftEntities, rightEntities, 24, 24, 53 - 4);
});

void ValidateFixup(
static void ValidateFixup(
DbContext context,
List<EntityCompositeKey> leftEntities,
List<EntityThree> rightEntities,
Expand Down Expand Up @@ -1005,7 +1005,7 @@ public virtual void Can_delete_with_many_to_many_composite_additional_pk_with_na
|| e.Entity.ThreeId == 17);
});

void ValidateNavigations(List<EntityCompositeKey> ones, List<EntityThree> threes)
static void ValidateNavigations(List<EntityCompositeKey> ones, List<EntityThree> threes)
{
foreach (var one in ones)
{
Expand Down Expand Up @@ -1050,7 +1050,7 @@ void ValidateNavigations(List<EntityCompositeKey> ones, List<EntityThree> threes
}
}

void ValidateJoinNavigations(DbContext context)
static void ValidateJoinNavigations(DbContext context)
{
foreach (var joinEntity in context.ChangeTracker.Entries<JoinThreeToCompositeKeyFull>().Select(e => e.Entity).ToList())
{
Expand Down Expand Up @@ -1121,7 +1121,7 @@ public virtual void Can_insert_many_to_many_self_shared()
ValidateFixup(context, leftEntities, rightEntities);
});

void ValidateFixup(DbContext context, IList<EntityTwo> leftEntities, IList<EntityTwo> rightEntities)
static void ValidateFixup(DbContext context, IList<EntityTwo> leftEntities, IList<EntityTwo> rightEntities)
{
Assert.Equal(11, context.ChangeTracker.Entries().Count());
Assert.Equal(6, context.ChangeTracker.Entries<EntityTwo>().Count());
Expand Down Expand Up @@ -1179,7 +1179,7 @@ public virtual void Can_update_many_to_many_self()
ValidateFixup(context, leftEntities, rightEntities, 28, 42 - 4);
});

void ValidateFixup(
static void ValidateFixup(
DbContext context,
List<EntityTwo> leftEntities,
List<EntityTwo> rightEntities,
Expand Down Expand Up @@ -1281,7 +1281,7 @@ public virtual void Can_insert_many_to_many_with_navs()
ValidateFixup(context, leftEntities, rightEntities);
});

void ValidateFixup(DbContext context, IList<EntityTwo> leftEntities, IList<EntityThree> rightEntities)
static void ValidateFixup(DbContext context, IList<EntityTwo> leftEntities, IList<EntityThree> rightEntities)
{
Assert.Equal(11, context.ChangeTracker.Entries().Count());
Assert.Equal(3, context.ChangeTracker.Entries<EntityTwo>().Count());
Expand Down Expand Up @@ -1348,7 +1348,7 @@ public virtual void Can_update_many_to_many_with_navs()
ValidateFixup(context, leftEntities, rightEntities, 24, 24, 60 - 4);
});

void ValidateFixup(
static void ValidateFixup(
DbContext context,
List<EntityTwo> leftEntities,
List<EntityThree> rightEntities,
Expand Down Expand Up @@ -1461,7 +1461,7 @@ public virtual void Can_insert_many_to_many_with_inheritance()
ValidateFixup(context, leftEntities, rightEntities);
});

void ValidateFixup(DbContext context, IList<EntityOne> leftEntities, IList<EntityBranch> rightEntities)
static void ValidateFixup(DbContext context, IList<EntityOne> leftEntities, IList<EntityBranch> rightEntities)
{
Assert.Equal(11, context.ChangeTracker.Entries().Count());
Assert.Equal(3, context.ChangeTracker.Entries<EntityOne>().Count());
Expand Down Expand Up @@ -1520,7 +1520,7 @@ public virtual void Can_update_many_to_many_with_inheritance()
ValidateFixup(context, leftEntities, rightEntities, 24, 14, 55 - 4);
});

void ValidateFixup(
static void ValidateFixup(
DbContext context,
List<EntityOne> leftEntities,
List<EntityBranch> rightEntities,
Expand Down Expand Up @@ -1712,7 +1712,7 @@ public virtual void Can_update_many_to_many_self_with_payload()
ValidateFixup(context, leftEntities, rightEntities, 28, 37 - 4, postSave: true);
});

void ValidateFixup(
static void ValidateFixup(
DbContext context,
List<EntityOne> leftEntities,
List<EntityOne> rightEntities,
Expand Down Expand Up @@ -1910,7 +1910,7 @@ public virtual void Can_update_many_to_many_shared_with_payload()
ValidateFixup(context, leftEntities, rightEntities, 24, 24, 48 - 4, postSave: true);
});

void ValidateFixup(
static void ValidateFixup(
DbContext context,
List<EntityOne> leftEntities,
List<EntityThree> rightEntities,
Expand Down Expand Up @@ -2034,7 +2034,7 @@ public virtual void Can_insert_many_to_many_shared()
ValidateFixup(context, leftEntities, rightEntities);
});

void ValidateFixup(DbContext context, IList<EntityOne> leftEntities, IList<EntityTwo> rightEntities)
static void ValidateFixup(DbContext context, IList<EntityOne> leftEntities, IList<EntityTwo> rightEntities)
{
Assert.Equal(11, context.ChangeTracker.Entries().Count());
Assert.Equal(3, context.ChangeTracker.Entries<EntityOne>().Count());
Expand Down Expand Up @@ -2093,7 +2093,7 @@ public virtual void Can_update_many_to_many_shared()
ValidateFixup(context, leftEntities, rightEntities, 24, 24, 49);
});

void ValidateFixup(
static void ValidateFixup(
DbContext context,
List<EntityOne> leftEntities,
List<EntityTwo> rightEntities,
Expand Down Expand Up @@ -2272,7 +2272,7 @@ public virtual void Can_update_many_to_many_with_payload()
ValidateFixup(context, leftEntities, rightEntities, 24, 24, 123 - 4, postSave: true);
});

void ValidateFixup(
static void ValidateFixup(
DbContext context,
List<EntityOne> leftEntities,
List<EntityThree> rightEntities,
Expand Down Expand Up @@ -2432,7 +2432,7 @@ public virtual void Can_delete_with_many_to_many_with_navs()
e => e.Entity.OneId == 1 || e.Entity.ThreeId == 1);
});

void ValidateNavigations(List<EntityOne> ones, List<EntityThree> threes)
static void ValidateNavigations(List<EntityOne> ones, List<EntityThree> threes)
{
foreach (var one in ones)
{
Expand Down Expand Up @@ -2463,7 +2463,7 @@ void ValidateNavigations(List<EntityOne> ones, List<EntityThree> threes)
}
}

void ValidateJoinNavigations(DbContext context)
static void ValidateJoinNavigations(DbContext context)
{
foreach (var joinEntity in context.ChangeTracker.Entries<JoinOneToThreePayloadFull>().Select(e => e.Entity).ToList())
{
Expand Down Expand Up @@ -2522,7 +2522,7 @@ public virtual void Can_insert_many_to_many()
ValidateFixup(context, leftEntities, rightEntities);
});

void ValidateFixup(DbContext context, IList<EntityOne> leftEntities, IList<EntityTwo> rightEntities)
static void ValidateFixup(DbContext context, IList<EntityOne> leftEntities, IList<EntityTwo> rightEntities)
{
Assert.Equal(11, context.ChangeTracker.Entries().Count());
Assert.Equal(3, context.ChangeTracker.Entries<EntityOne>().Count());
Expand Down Expand Up @@ -2581,7 +2581,7 @@ public virtual void Can_update_many_to_many()
ValidateFixup(context, leftEntities, rightEntities, 24, 24, 116);
});

void ValidateFixup(
static void ValidateFixup(
DbContext context,
List<EntityOne> leftEntities,
List<EntityTwo> rightEntities,
Expand Down Expand Up @@ -2700,7 +2700,7 @@ public virtual void Can_delete_with_many_to_many()
Assert.DoesNotContain(context.ChangeTracker.Entries<JoinOneToTwo>(), e => e.Entity.OneId == 1 || e.Entity.TwoId == 1);
});

void ValidateNavigations(List<EntityOne> ones, List<EntityTwo> twos)
static void ValidateNavigations(List<EntityOne> ones, List<EntityTwo> twos)
{
foreach (var one in ones)
{
Expand Down Expand Up @@ -2778,7 +2778,7 @@ public virtual void Can_insert_many_to_many_fully_by_convention()
Assert.Single(rightEntities[2].As);
});

void ValidateFixup(DbContext context, IList<ImplicitManyToManyA> leftEntities, IList<ImplicitManyToManyB> rightEntities)
static void ValidateFixup(DbContext context, IList<ImplicitManyToManyA> leftEntities, IList<ImplicitManyToManyB> rightEntities)
{
Assert.Equal(11, context.ChangeTracker.Entries().Count());
Assert.Equal(3, context.ChangeTracker.Entries<ImplicitManyToManyA>().Count());
Expand Down Expand Up @@ -2817,15 +2817,10 @@ public virtual void Can_load_entities_in_any_order(int[] order)
}).Load();
}

ValidateCounts(context, 152, 20, 20, 112);
}

private static void ValidateCounts(DbContext context, int total, int ones, int twos, int joins)
{
Assert.Equal(total, context.ChangeTracker.Entries().Count());
Assert.Equal(ones, context.ChangeTracker.Entries<EntityOne>().Count());
Assert.Equal(twos, context.ChangeTracker.Entries<EntityTwo>().Count());
Assert.Equal(joins, context.ChangeTracker.Entries<JoinOneToTwo>().Count());
Assert.Equal(152, context.ChangeTracker.Entries().Count());
Assert.Equal(20, context.ChangeTracker.Entries<EntityOne>().Count());
Assert.Equal(20, context.ChangeTracker.Entries<EntityTwo>().Count());
Assert.Equal(112, context.ChangeTracker.Entries<JoinOneToTwo>().Count());

var leftEntities = context.ChangeTracker.Entries<EntityOne>().Select(e => e.Entity).OrderBy(e => e.Id).ToList();
var rightEntities = context.ChangeTracker.Entries<EntityTwo>().Select(e => e.Entity).OrderBy(e => e.Id).ToList();
Expand All @@ -2850,7 +2845,53 @@ private static void ValidateCounts(DbContext context, int total, int ones, int t
}

var deleted = context.ChangeTracker.Entries<JoinOneToTwo>().Count(e => e.State == EntityState.Deleted);
Assert.Equal(joins, (joinCount / 2) + deleted);
Assert.Equal(112, (joinCount / 2) + deleted);
}

[ConditionalFact]
public void Can_insert_update_delete_shared_type_entity_type()
{
ExecuteWithStrategyInTransaction(
context =>
{
var entity = context.Set<Dictionary<string, object>>("JoinOneToThreePayloadFullShared").CreateInstance(
c =>
{
c["OneId"] = 1;
c["ThreeId"] = 1;
c["Payload"] = "NewlyAdded";
});
context.Set<Dictionary<string, object>>("JoinOneToThreePayloadFullShared").Add(entity);

context.SaveChanges();
},
context =>
{
var entity = context.Set<Dictionary<string, object>>("JoinOneToThreePayloadFullShared")
.Single(e => (int)e["OneId"] == 1 && (int)e["ThreeId"] == 1);

Assert.Equal("NewlyAdded", (string)entity["Payload"]);

entity["Payload"] = "AlreadyUpdated";

context.Set<Dictionary<string, object>>("JoinOneToThreePayloadFullShared").Update(entity);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ajcvickers - Why was this necessary to update the entity on database?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did this fail for the changing tracking proxy test only? If so, it looks like it's because changing an indexer property is not sending a notification to the state manager. This is a bug. (Even if it turns out to be impossible, it should at least be a warning when using change tracking prioxies.)

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, only failed for changetracking proxies


context.SaveChanges();
},
context =>
{
var entity = context.Set<Dictionary<string, object>>("JoinOneToThreePayloadFullShared")
.Single(e => (int)e["OneId"] == 1 && (int)e["ThreeId"] == 1);

Assert.Equal("AlreadyUpdated", (string)entity["Payload"]);

context.Set<Dictionary<string, object>>("JoinOneToThreePayloadFullShared").Remove(entity);

context.SaveChanges();

Assert.False(context.Set<Dictionary<string, object>>("JoinOneToThreePayloadFullShared")
.Any(e => (int)e["OneId"] == 1 && (int)e["ThreeId"] == 1));
});
}

protected ManyToManyTrackingTestBase(TFixture fixture) => Fixture = fixture;
Expand Down
Loading