我在netstandard1.6应用程序中使用EFCore 1.1.0。
我已使用复合键
配置了我的模型public class ClassExtension
{
public int Id { get; set; }
public string Name { get; set; }
public int ClassId { get; set; }
public MyClass Class { get; set; }
}
public class MyClass
{
public int Id { get; set; }
public string Name { get; set; }
public List<ClassExtension> Extensions { get; set; }
public Class()
{
Extensions = new List<ClassExtension>();
}
}
然后在我的dbcontext OnModelCreating()
中modelBuilder.Entity<ClassExtension>()
.HasKey(p => new { p.Id, p.ClassId });
然后我从数据库中获取特定复合键的现有实例,然后根据用户输入在代码中创建一个新的ClassExtension实例,最后将这些值分配给实体然后保存。
var existingSpec = await db.ClassSpecs.Where(
c => c.ClassId == existingClass.Id && c.Id == input.Id)
.FirstOrDefaultAsync();
var newExtension = new ClassExtension()
{
Id = input.Id,
Name = input.Name
};
db.Entry(existingSpec).CurrentValues.SetValues(newSpec); // Errors on this line
db.Entry(existingSpec).Property(p => p.ClassId).IsModified = false;
await db.SaveChangesAsync()
尝试使用SetValues()
分配值时,应用程序会生成以下错误{System.InvalidOperationException: The property 'ClassId' on entity type 'ClassExtension'
is part of a key and so cannot be modified or marked as modified.
... removed ...
at MyApplication...
当我在没有复合键的表上执行此操作时,它可以正常工作,而不是使用null覆盖现有外键Id,只使用其现有值。
是否有我遗漏的东西,或者这只是使用复合键的怪癖?