EF(每种类型的表) - 更改实体的类类型

时间:2017-01-19 08:13:50

标签: .net entity-framework code-first table-per-type

我在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(); 

1 个答案:

答案 0 :(得分:0)

  

"更新实体时,我想将其保存为BankAccount类型   相同的主键。有可能吗?"

如果主键是数据库生成的 - 否,因为这些是SQL中的两个单独的表,并且如果它们的受尊重的主键(名为Id)被设置为通过递增id而生成的数据库,则违反了生成规则。阅读异常的消息和内部异常的消息 - 也许有解释。

检查EF的约定,找到名为Id的属性,它们是int并标记为Key。

来自Entity Framework Code First Conventions

  

Code First推断,如果类上的属性名为“ID”(不区分大小写),或者类名后跟" ID",则属性是主键。如果主键属性的类型是数字或GUID,则它将被配置为标识列。

检查SQL的表模式以验证这一点。我几乎可以肯定Id列被设置为通过增加Id来生成数据库。