这听起来很奇怪,但是我有一个实体:
public class Center : Archive
{
public int Id { get; set; }
[MaxLength(50)] public string ExternalId { get; set; }
[Required] [MaxLength(150)] public string Name { get; set; }
[MaxLength(255)] public string Description { get; set; }
[MaxLength(50)] public string Address1 { get; set; }
[MaxLength(50)] public string Address2 { get; set; }
[MaxLength(50)] public string Address3 { get; set; }
[MaxLength(50)] public string Address4 { get; set; }
[MaxLength(10)] public string PostCode { get; set; }
[MaxLength(100)] public string CollectionPointContact { get; set; }
[MaxLength(50)] public string CollectionPointTelephone { get; set; }
[MaxLength(50)] public string CollectionPointFax { get; set; }
[MaxLength(255)] public string CollectionPointEmail { get; set; }
[NotMapped] public int Due { get; set; }
[NotMapped] public int Today { get; set; }
[NotMapped] public int Expected { get; set; }
[NotMapped] public int Planned { get; set; }
public int CompanyId { get; set; }
public Company Company { get; set; }
public IList<Collection> Collections { get; set; }
}
在列出,编辑,创建等时。[NotMapped]
属性不应映射到数据库中。
但是,我有一个填充这些属性的存储过程:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[ListCentersByCompany]
@CompanyId [int]
AS
BEGIN
select ce.*,
SUM(CASE WHEN co.PlannedCollectionDate < CONVERT(DATE, GETDATE()) THEN 1 ELSE 0 END) AS Due,
SUM(CASE WHEN co.PlannedCollectionDate = CONVERT(DATE, GETDATE()) THEN 1 ELSE 0 END) AS Today,
SUM(CASE WHEN co.PlannedCollectionDate = DATEADD(DAY, 1, CONVERT(DATE, GETDATE())) THEN 1 ELSE 0 END) AS Expected,
SUM(CASE WHEN co.PlannedCollectionDate > DATEADD(DAY, 1, CONVERT(DATE, GETDATE())) THEN 1 ELSE 0 END) AS Planned
from Centers ce join
Collections co
on ce.Id = co.CenterId
WHERE ce.CompanyId = @CompanyId
group by
ce.Id,
ce.ExternalId,
ce.Name,
ce.Description,
ce.Address1,
ce.Address2,
ce.Address3,
ce.Address4,
ce.PostCode,
ce.CollectionPointContact,
ce.CollectionPointEmail,
ce.CollectionPointFax,
ce.CollectionPointTelephone,
ce.CompanyId,
ce.CreatedById,
ce.ModifiedById,
ce.DateCreated,
ce.DateModified
END
EntityFramework知道不映射它们,但是当我使用SPROC时,我希望它们被映射。 那可能吗?我知道,我可以创建一个新模型并使用它,但是我想知道是否有更简单的方法?
答案 0 :(得分:0)
Database.SqlQuery
在具有或不具有实体类型的情况下的行为为documented extensively:
创建一个原始SQL查询,该查询将返回给定类型的元素。该类型可以是具有与查询返回的列名相匹配的属性的任何类型,也可以是简单的原始类型。该类型不必是实体类型。即使返回的对象类型是实体类型,上下文也永远不会跟踪此查询的结果。
还,未提及具有非映射属性的古怪行为。正在运行...
_context.Database.SqlQuery<T>($"exec {storedProcedureName}")
当T
是映射的实体类型时,...不填充未映射的属性。当使用任何其他包含匹配属性的类型时,它将执行此操作。我认为这有点奇怪,甚至怀疑这是意外行为。
因此您不能使用Center
作为接收类型,但是可以使用直接从Center
继承的非映射类型。