gpt4 book ai didi

c# - Entity Framework 继承

转载 作者:太空狗 更新时间:2023-10-30 00:24:08 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com