SQL 层:
我有一张 table
Entity Framework 层:
我有以下规则:所有状态为空的报价都是未完成的报价,状态为真是已接受的报价,状态为假的是拒绝的报价。此外,部分字段仅用于杰出,部分 - 仅用于已接受等......我使用数据库优先方法,因此,我从数据库更新了 EF 模型并将 Offer 实体重命名为 OfferBase 并创建了 3 个子类:
它适用于添加/选择实体/记录。现在我想将要约从未完成的“移动”到接受要约,因此,我需要设置 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/