EF6只读属性导致列名无效

时间:2017-07-18 18:25:50

标签: c# sql-server entity-framework stored-procedures entity-framework-6

我的情况与关于阻止对象属性更新的文章很接近,但他们的解决方案始终是使用 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等等。我总是失败,说无效列。

因此,可以通过存储过程调用填充属性,但在该字段不重要时仍然可以使用更新,仅在插入和更新时有效地忽略该字段。

0 个答案:

没有答案