所以在我的实体中,我有一些我在视图中不需要的大列。对于不加载大型列我使用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加载的列的名称,因为它很大,我在视图中不需要它。
那么如何从我的视图更新现有的实体?
答案 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”。