我在Web API应用中使用EF 6.1。我实现了每种类型的表(TPT)。我按照this教程,一切正常。我想在更新实体时更改实体类型。
public abstract class BillingDetail
{
[Key]
public int Id { get; set; }
}
[Table("BankAccounts")]
public class BankAccount : BillingDetail
{ }
[Table("CreditCards")]
public class CreditCard : BillingDetail
{ }
我已经保存了CreditCard类型实体。更新实体时,我想将其保存为具有相同主键的BankAccount类型。有可能吗?
这是我尝试过的,但它会抛出 DbUpdateConcurrencyException 。
BankAccount record = ...;
record.Id = 1; //the Id of CreditCard entity
ctx.BillingDetail.Attach(record);
ctx.Entry(record).State = EntityState.Modified;
ctx.SaveChanges();
答案 0 :(得分:0)
"更新实体时,我想将其保存为BankAccount类型 相同的主键。有可能吗?"
如果主键是数据库生成的 - 否,因为这些是SQL中的两个单独的表,并且如果它们的受尊重的主键(名为Id)被设置为通过递增id而生成的数据库,则违反了生成规则。阅读异常的消息和内部异常的消息 - 也许有解释。
检查EF的约定,找到名为Id的属性,它们是int并标记为Key。
来自Entity Framework Code First Conventions。
Code First推断,如果类上的属性名为“ID”(不区分大小写),或者类名后跟" ID",则属性是主键。如果主键属性的类型是数字或GUID,则它将被配置为标识列。
检查SQL的表模式以验证这一点。我几乎可以肯定Id列被设置为通过增加Id来生成数据库。