如何仅更新实体框架中的选定字段(匿名类型到强类型)

时间:2011-03-15 10:26:02

标签: c# .net entity-framework

所以在我的实体中,我有一些我在视图中不需要的大列。对于不加载大型列我使用anonymouse类型,强制转换为强类型

       _ctx = new hModelContainer();
       var skAnonym = from s in _ctx.Sketches
                         where s.SketchStatus.Id == 0
                         select new
                         {
                             s.Id,
                             s.Number,
                             s.Author,
                             s.SketchStatus,
                             s.Title,
                             s.Comments
                         };

            var skStrong = skAnonymt.AsEnumerable().Select(s =>
                         new Sketch
                         {
                             Id = s.Id,
                             Number = s.Number,
                             Author = s.Author,
                             SketchStatus = s.SketchStatus,
                             Title = s.Title,
                             Comments = s.Comments
                         });

            _sketchs = skStrong.ToList();

然后我在WPF视图中更新我的_sketchs集合,并希望将其保存到数据库。如果我试图直接_ctx.SaveChanges();我有一个例外

  

“...无法将NULL插入noNulleable   字段TextXML“

TextXML是我没有从DB加载的列的名称,因为它很大,我在视图中不需要它。 那么如何从我的视图更新现有的实体?

2 个答案:

答案 0 :(得分:2)

如果您想避免加载大字段,请检查table splitting。它将为您节省大量精力,因为您将主要只使用不包含该字段的实体。

如果您不想使用表格拆分,则必须手动说明应更新哪些字段:

using (var context = new MyContext())
{
    context.Attach(sketch);
    ObjectStateEntry entry = context.ObjectStateManager.GetObjectStateEntry(sketch);
    entry.SetModifiedProperty("Number");
    ...
    context.SaveChanges();
}

答案 1 :(得分:0)

这对我有用。我创建了一个这样的测试表:

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]') AND type in (N'U'))
DROP TABLE [dbo].[MyTable]
GO

CREATE TABLE [dbo].[MyTable](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Data1] [varchar](50) NOT NULL,
    [Data2] [varchar](50) NOT NULL,
 CONSTRAINT [PK_MyTable] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

INSERT INTO [dbo].[MyTable] (Data1,Data2) VALUES ('Row 1 - Data 1', 'Row1 - Data 2')
INSERT INTO [dbo].[MyTable] (Data1,Data2) VALUES ('Row 2 - Data 1', 'Row2 - Data 2')
GO

在VS中,我使用向导将此表导入实体模型。然后我写了下面的代码:

        TestEntities ctx = new TestEntities();
        var data = from d in ctx.MyTables select new { d.Id, d.Data1 };
        var data2 = data.AsEnumerable().Select(x => new MyTable(){Id = x.Id, Data1 =  x.Data1 });
        var data3 = data2.ToList();

        foreach (var item in data3)
        {
            ctx.MyTables.Attach(item);
        }

        data3[0].Data1 = "Hello";            

        ctx.SaveChanges();

执行此代码后,我查看了数据库并检查了该值是否已更改为“Hello”。