首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架继承

实体框架继承
EN

Stack Overflow用户
提问于 2015-03-10 17:42:30
回答 2查看 640关注 0票数 4

SQL层:

我有张桌子

实体框架层:

我有以下规则:所有有状态的要约都是无效的,是优秀的要约,国家是真实的被接受的要约,国家是假的是被拒绝的要约。此外,部分字段仅用于优秀,部分仅用于接受等.我使用数据库优先方法,因此,我从DB更新了EF模型,并将提供实体重命名为OfferBase,并创建了3个子类:

它适用于添加/选择实体/记录。现在,我想“移动”要约从未完成的,接受要约,所以,我需要设置Status=true (从状态为空),以获得适当的记录。但是如何通过实体框架来实现呢?如果我试图选择未完成的报价作为接受要约,我将得到一个空引用(以及清楚的原因)

代码语言:javascript
复制
// 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实体,则会得到以下错误:

无法将'System.Data.Entity.DynamicProxies.OfferOutstanding_9DD3E4A5D716F158C6875FA0EDF5D0E52150A406416D4D641148F9AFE2B5A16A‘类型的对象强制转换为'VTS.EFModels.OfferAccepted’。

代码语言:javascript
复制
    var offerB = (from i in _db.OfferBases where i.ID == 1 select i).FirstOrDefault();
    var offer = (EFModels.OfferAccepted)offerB;

添加了关于建筑的注释:

我有三种类型的报价实体。有: AcceptOffer,DeclineOffer和OutstandingOffer。

AcceptOffer:

  • UserID
  • ContactID
  • 备注
  • FirstContactDate
  • LastContactDate
  • ..。和5-10独特的领域..。

DeclineOffer:

  • UserID
  • ContactID
  • 备注
  • ..。和5-10独特的领域..。

OutstandingOffer:

  • UserID
  • ContactID
  • FirstContactDate
  • LastContactDate
  • ..。和5-10独特的领域..。

怎样才能做好呢?当然,我可以选择一个记录,从DB中删除并添加具有适当状态值的新记录,但是如何正常执行呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-13 10:16:49

一旦创建了对象,就不能更改它的类型。你的对象模型似乎错了。您可以删除未完成的提议并从其中创建可接受的提议(看起来像您当前正在做的事情),但是您可能会失去关系,因为您创建了一个具有新标识的新对象(您还可以在删除旧对象之前复制它们)。或者您希望保持相同的对象并更改其状态。

如果您想保持相同的身份,那么就先使用组合重于继承

您的代码可能如下所示:

代码语言:javascript
复制
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 (PM所有者for EF):更改实体的类型所述。

票数 6
EN

Stack Overflow用户

发布于 2015-03-13 10:23:20

不要试图将这些自定义类添加到实体框架模型中,只需将它们创建为普通的c#类,然后使用投影将生成的实体框架类转换为您自己的类。

代码语言:javascript
复制
var accepteOffers= from i in _db.Offers
                   where i.ID == 1 && i.Status == true
                   select new OfferAccepted { AcceptDate = i.AcceptDate, StartTime = i.StartTime /* map all releaveant fields here */};
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28970529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档