コード例 #1
0
        /// <summary>
        /// Simulates a disconnected scenario - Creates a work item in a dbContext. Then uses a different Context, loads the WorkItem
        /// and tries to add a comment to the Comments property.
        /// </summary>
        /// <param name="wiContext"></param>
        private static async Task GenerateWorkItemWithComment3(WorkItemDbContext wiContext)
        {
            var workItem = new WorkItem
            {
                Id    = Guid.NewGuid(),
                Title = "Some work item"
            };

            // Save the workItem first with the passed in DbContext
            // Like a request to an endpoint "CreateWorkItem"
            wiContext.WorkItems.Add(workItem);
            await wiContext.SaveChangesAsync();

            // simulates a "disconnected scenario" where I only want to add a comment
            // Like a request to an endpoint "AddComment"
            using (var newContext = new WorkItemDbContext())
            {
                var existingWorkItem = await newContext.WorkItems.Include(wi => wi.Comments)
                                       .FirstAsync(wi => wi.Id == workItem.Id);

                var comment = new WorkItemComment
                {
                    Id      = Guid.NewGuid(),
                    Comment = "SOme comment",
                };

                existingWorkItem.Comments.Add(comment);

                // State is "Unchanged"
                var workItemState = newContext.Entry(existingWorkItem).State;

                // State is "Detached"
                var state2 = newContext.Entry(comment).State;

                // Fails
                await newContext.SaveChangesAsync();
            }

            var saved = await GetWorkItem(wiContext, workItem.Id);

            if (saved.Comments.Count != 1)
            {
                throw new InvalidOperationException("WorkItem should have one comment");
            }
        }
コード例 #2
0
        /// <summary>
        /// Creates/Saves the WorkItem first then use the same instance and add a comment to the Comments property
        /// </summary>
        /// <param name="wiContext"></param>
        /// <returns></returns>
        private static async Task GenerateWorkItemWithComment1(WorkItemDbContext wiContext)
        {
            var workItem = new WorkItem
            {
                Id    = Guid.NewGuid(),
                Title = "Some work item"
            };

            // Save the workItem first
            wiContext.WorkItems.Add(workItem);
            await wiContext.SaveChangesAsync();

            var comment = new WorkItemComment
            {
                Id      = Guid.NewGuid(),
                Comment = "Some comment",
            };

            // Add the comment to the saved comment instance
            workItem.Comments.Add(comment);

            // State is unchanged
            var workItemState = wiContext.Entry(workItem).State;

            // PROBLEM: The comment has a state of Modified.
            var state2 = wiContext.Entry(comment).State;

            // Call fails with UPDATE comment instead of insert
            await wiContext.SaveChangesAsync();

            var saved = await GetWorkItem(wiContext, workItem.Id);

            if (saved.Comments.Count != 1)
            {
                throw new InvalidOperationException("WorkItem should have one comment");
            }
        }