我的情况与关于阻止对象属性更新的文章很接近,但他们的解决方案始终是使用 NotMapped 属性来解决问题,但这不会起作用对我而言,因为我需要在执行存储过程时检索到的数据,但我不想在保存实体时更新它,因为它实际上并不是表中的一列。
所以我的问题是,是否可以执行以下操作?:
我有两个类似于以下的表:
CREATE TABLE [StatusTypes](
[intStatusID] [int] NOT NULL,
[vchStatusType] [nvarchar](50) NOT NULL,
[intSortOrder] [int] NOT NULL CONSTRAINT [DF_tblStatusTypes_x_intSortOrder] DEFAULT ((0)),
[IsDeleted] [bit] NOT NULL CONSTRAINT [DF_tblStatusTypes_x_IsDeleted] DEFAULT ((0)),
[StatusColor] [nvarchar](7) NOT NULL CONSTRAINT [DF_tblStatusTypes_x_StatusColor] DEFAULT (''),
CONSTRAINT [PK_tblStatusTypes_x] PRIMARY KEY CLUSTERED
(
[intStatusID] ASC
))
GO
CREATE TABLE [MyItems](
[intMyItemId] [int] NOT NULL,
[ItemDescription] [nvarchar](2000),
[StatusId] [int],
CONSTRAINT [PK_MyItems_x] PRIMARY KEY CLUSTERED
(
[intMyItemId] ASC
))
GO
ALTER TABLE [dbo].[MyItems] WITH CHECK ADD CONSTRAINT [FK_STATUS] FOREIGN KEY([StatusId])
REFERENCES [dbo].[StatusTypes] ([intStatusID])
GO
因此,为了节省额外的查询和查询,当我们获取此数据时,我们使用类似于此的存储过程:
SELECT
intMyItemId,
ItemDescription,
StatusId,
vchStatusType as StatusType
FROM MyItems i
INNER JOIN StatusTypes s
ON s.intStatusID = i.StatusId
和一个看起来像这样的实体:
[Table("MyItems")]
public class Item
{
[Key]
[Column("intMyItemId")]
public int ItemID { get; set; }
[Column("ItemDescription")]
public string ItemDescription { get; set; }
public int StatusId { get; set; }
public string ItemStatus { get; set; }
}
现在,当存储过程正在执行并且我们使用对象时,这可以正常工作。问题是我试图加载一个新项目,我在代码中创建一个。即使我没有填写ItemStatus字段,也没有特别将其设置为NotModified,如下所示:DbContext.Entry<Item>().Property("ItemStatus").IsModified = false
等等。我总是失败,说无效列。
因此,可以通过存储过程调用填充属性,但在该字段不重要时仍然可以使用更新,仅在插入和更新时有效地忽略该字段。