У меня есть тип, 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
}
У кого-нибудь есть мысли о том, что здесь может происходить? Разве я не могу сохранить дочерние коллекции, как это? Если вам нужна дополнительная информация, просто спросите.
Спасибо.