c# - Entity Framework 继承

标签 c# entity-framework inheritance

SQL 层:

我有一张 table

enter image description here

Entity Framework 层:

我有以下规则:所有状态为空的报价都是未完成的报价,状态为真是已接受的报价,状态为假的是拒绝的报价。此外,部分字段仅用于杰出,部分 - 仅用于已接受等......我使用数据库优先方法,因此,我从数据库更新了 EF 模型并将 Offer 实体重命名为 OfferBase 并创建了 3 个子类:

enter image description here

它适用于添加/选择实体/记录。现在我想将要约从未完成的“移动”到接受要约,因此,我需要设置 Status=true(从 Status 为 null)以进行适当的记录。但是如何通过 Entity Framework 来实现呢?如果我尝试选择未完成的报价作为接受报价,我会得到一个空引用(并清楚地说明原因)

// record with ID=1 exists, but State is null, so, EF can not find this record and offer will be null after the following string
var offer = (from i in _db.OfferBases.OfType<EFModels.OfferAccepted>() where i.ID == 1 select i).FirstOrDefault();

如果我尝试选择作为 OfferBase 实体,我会收到以下错误:

Unable to cast object of type 'System.Data.Entity.DynamicProxies.OfferOutstanding_9DD3E4A5D716F158C6875FA0EDF5D0E52150A406416D4D641148F9AFE2B5A16A' to type 'VTS.EFModels.OfferAccepted'.

    var offerB = (from i in _db.OfferBases where i.ID == 1 select i).FirstOrDefault();
    var offer = (EFModels.OfferAccepted)offerB;

添加了关于架构的注释:

我有 3 种类型的要约实体。有:AcceptOffer、DeclineOffer 和 OutstandingOffer。

接受提议:

  • UserID
  • ContactID
  • Notes
  • FirstContactDate
  • LastContactDate
  • [... and 5-10 the unique fields...]

拒绝报价:

  • UserID
  • ContactID
  • Notes
  • [... and 5-10 the unique fields...]

优秀报价:

  • UserID
  • ContactID
  • FirstContactDate
  • LastContactDate
  • [... and 5-10 the unique fields...]

如何正确操作?当然,我可以选择一条记录,从数据库中删除并添加具有适当状态值的新记录,但是如何正常进行呢?

最佳答案

对象一旦创建就无法更改其类型。您的对象模型似乎是错误的。 您要么删除未完成的报价并从中创建一个已接受的报价(看起来像您当前正在做的),但是您可能会在创建具有新身份的新对象时失去关系(您也可以在删除旧对象之前复制它们)。或者您想保留同一个对象并更改其状态。

如果您想保持相同的身份,请选择 composition over inheritance .

您的代码可能如下所示:

public class Offer
{
  public int Id { get; set; }
  public virtual OfferState State { get; set }
}

public class OfferState
{
  public int OfferId { get; set; }
  public string Notes { get; set; }
}

public class AcceptedOfferState : OfferState
{
  public DateTimeOffset AcceptDate { get; set; }
}

public class DeclinedOfferState : OfferState
{
  public DateTimeOffset DeclinedDate { get; set; }
}

如果您仍想更改对象的类型并保持其身份,那么您可以使用存储过程;正如 Noam Ben-Ami(EF 的 PM 所有者)所述:Changing the type of an entity .

关于c# - Entity Framework 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28970529/

相关文章:

c# - 将附加对象传递给 CreateMap

minOccurs ="0"元素上的 C# XSD 验证失败

linq - 用于多个edmx文件的Linq-To-Entities连接字符串

c# - ASP.NET MVC Entity Framework 延迟加载或 ViewModel?

c++ - 重写模板方法

c++ - 防止继承 operator new 和 delete

c# - C# 中的 ActiveDirectory 入门

c# - Entity Framework 代码优先一对零关系

c++ - 棋子层级设计: inheritance vs type fields

C# switch 语句限制 - 为什么?