Первичный ключ удостоверения личности EF неправильно увеличивается при сохранении в качестве члена дочерней коллекции - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть тип, Code, который является членом дочерней коллекции Thing через таблицу ссылок. Первичный ключ Code обрабатывается как столбец идентификаторов; Thing имеет составной ПК, образованный двумя идентификаторами. Когда я сохраняю экземпляр Code, добавляя его в свой dbContext и сохраняя, его идентификатор увеличивается, как и ожидалось. Но когда он сохраняется как член коллекции Thing, его идентификатор увеличивается на 2 каждый раз, хотя в БД сохраняется только один экземпляр.

Вот код, иллюстрирующий то, о чем я говорю:

public class Thing
    {
        // The following two Ids comprise a composite PK. Their values are being incremented manually, by the code:
        public int ThingId { get; set; }
        public int ThingVersionId { get; set; }

        public virtual ICollection<ThingCode> ThingCodes { get; set; }
    }

    public class ThingCode
    {
        public int ThingId { get; set; }
        public int ThingVersionId { get; set; }
        public int CodeId { get; set; }

        public virtual Thing Thing { get; set; }
        public virtual Code Code { get; set; }
    }

    public class Code
    {
        public int CodeId { get; set; }
        public string Name { get; set; }

        public virtual ICollection<ThingCode> ThingCodes { get; set; }
    }

    public class Test
    {
        [Fact]
        public void DbSavesWithUnexpectedId()
        {
            Thing thing = new Thing
            {
                ThingCodes = new List<ThingCode>
                {
                    new ThingCode
                    {
                        Code = new Code {Name = "code name"}
                    }
                }
            };

            // make in-memory dbContext...
            inMemoryDbContext.Add(thing);
            inMemoryDbContext.SaveChanges();

            var allCodes = inMemoryDbContext.Code.ToList();

            Assert.Single(allCodes); //passes    
            Assert.Equal(1, allCodes[0].CodeId); //Fails, CodeId=2

        }

        [Fact]
        public void DbSavesWithExpectedId()
        {
            Code code = new Code { Name = "sdfsd" };

            // make in-memory dbContext...
            inMemoryDbContext.Add(code);
            inMemoryDbContext.SaveChanges();

            var allCodes = inMemoryDbContext.Code.ToList();

            Assert.Single(allCodes); //passes    
            Assert.Equal(1, allCodes[0].CodeId); // passes

        }

У кого-нибудь есть мысли о том, что здесь может происходить? Разве я не могу сохранить дочерние коллекции, как это? Если вам нужна дополнительная информация, просто спросите.

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...