SQL层:
我有张桌子

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

它适用于添加/选择实体/记录。现在,我想“移动”要约从未完成的,接受要约,所以,我需要设置Status=true (从状态为空),以获得适当的记录。但是如何通过实体框架来实现呢?如果我试图选择未完成的报价作为接受要约,我将得到一个空引用(以及清楚的原因)
// 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’。
var offerB = (from i in _db.OfferBases where i.ID == 1 select i).FirstOrDefault();
var offer = (EFModels.OfferAccepted)offerB;添加了关于建筑的注释:
我有三种类型的报价实体。有: AcceptOffer,DeclineOffer和OutstandingOffer。
AcceptOffer:
DeclineOffer:
OutstandingOffer:
怎样才能做好呢?当然,我可以选择一个记录,从DB中删除并添加具有适当状态值的新记录,但是如何正常执行呢?
发布于 2015-03-13 10:16:49
一旦创建了对象,就不能更改它的类型。你的对象模型似乎错了。您可以删除未完成的提议并从其中创建可接受的提议(看起来像您当前正在做的事情),但是您可能会失去关系,因为您创建了一个具有新标识的新对象(您还可以在删除旧对象之前复制它们)。或者您希望保持相同的对象并更改其状态。
如果您想保持相同的身份,那么就先使用组合重于继承。
您的代码可能如下所示:
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):更改实体的类型所述。
发布于 2015-03-13 10:23:20
不要试图将这些自定义类添加到实体框架模型中,只需将它们创建为普通的c#类,然后使用投影将生成的实体框架类转换为您自己的类。
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 */};https://stackoverflow.com/questions/28970529
复制相似问题