EntityFramework 在更新和插入中排除一些字段
EntityFramework Exclude Some Fields in Updating and Inserting
这是我第一个使用 Entity Framework 的项目,我想忽略插入、更新活动中的一些数据列。但是当我在我的视图上显示数据时,我仍然需要绑定它们。
在下图中,您可以看到我的模型和Table结构中的一些代码
在 SQL 服务器中,DateCreated,我将它的默认值设置为 'GETDATE()' 并且它应该在插入和更新语句中完全被忽略。
同样,UserCreated 和 DateCreated 也应该排除在 Update 操作中。
但是当我试图捕获发送到服务器的 SQL 脚本时,这些值包含在生成的 SQL 中,这导致我出现 DateTime 溢出、不接受 Null 值等错误,等..
在 SQL Profiler
中生成了 SQL 脚本
exec sp_executesql N'INSERT [dbo].[Events]([Title], [Detail], [StartDate], [StartTime], [EndTime], [CategoryID], [Campus], [Location], [DateCreated], [UserCreated], [DateModified], [UserModified], [state], [IsPosted])
VALUES (@0, @1, @2, @3, @4, @5, @6, NULL, @7, @8, NULL, NULL, @9, @10)
SELECT [EventID]
FROM [dbo].[Events] WHERE @@ROWCOUNT > 0 AND [EventID] = scope_identity()',
N'@0 varchar(1000),@1 varchar(4000),@2 datetime2(7),@3 time(7),@4 time(7),@5 varchar(10),@6 varchar(100),@7 datetime2(7),@8 varchar(50),@9 tinyint,@10 bit',@0='Football',
@1='Welcome to <strong>Football </strong>Match',@2='2016-01-29 00:00:00',@3='07:00:00',@4='12:00:00',@5='GIG',@6='xxxx',@7='0001-01-01 00:00:00',@8='username',@9=0,@10=0
插入
在 DateCreated 列上使用 [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 数据注释以使用数据库生成的默认值。
https://msdn.microsoft.com/en-us/data/jj591583.aspx#DatabaseGenerated
更新
Entity Framework只更新修改字段,所以根本不改变UserCreated的值,它不会被更新。
当插入或更新时,只需省略您不想更新或插入的字段,如下所示
[HttpPost]
public ActionResult Index(TimeSpan StartTime, TimeSpan EndTime, string CategoryID, string Campus, string Location, DateTime DateModified, string UserModified,
byte State, bool IsPosted)
{
var yourDbContext = new yourDbContext();
Events events = new Events();
events.StartTime=StartTime;
events.EndTime=EndTime;
events.CategoryID=CategoryID;
events.Campus=Campus;
events.Location =Location;
events.DateModified=DateModified;
events.UserModified=UserModified;
events.State= State;
events.IsPosted= IsPosted;
//Inserting
try
{
yourDbContext.Events.Add(events);
yourDbContext.SaveChanges();
return Json("Inserted", JsonRequestBehavior.AllowGet);
}
catch (Exception e)
{
return Json(e.ToString(), JsonRequestBehavior.AllowGet);
}
//end of inserting
//Updating
try
{
yourDbContext.Entry(events).State = EntityState.Modified;
yourDbContext.SaveChanges();
return Json("Updated", JsonRequestBehavior.AllowGet);
}
catch (Exception e)
{
return Json(e.ToString(), JsonRequestBehavior.AllowGet);
}
//End of updating
}
在视图上显示数据时,只需根据事件模型生成强类型视图
这也可以在控制器中实现。
创建
在create方法中可以设置CreatedBy和CreatedOn的值。
CreatedOn = DateTime.Now;
CreatedBy = User.Identity.Name; //In case of Windows authentication else user name can be taken from the db
ModifiedOn = null;
ModifiedBy = null;
更新
在更新中,您可以再次设置 ModifiedBy 和 ModifiedOn 的值,如上并保留 CreatedBy 和 CreatedOn,可以添加以下内容
events.ModifiedOn = DateTime.now;
events.ModifiedBy = User.Identity.Name;
db.Entry(events).State = EntityState.Modified;
db.Entry(events).Property("CreatedOn").IsModified = false;
db.Entry(events).Property("CreatedBy").IsModified = false;
这是我第一个使用 Entity Framework 的项目,我想忽略插入、更新活动中的一些数据列。但是当我在我的视图上显示数据时,我仍然需要绑定它们。
在下图中,您可以看到我的模型和Table结构中的一些代码
在 SQL 服务器中,DateCreated,我将它的默认值设置为 'GETDATE()' 并且它应该在插入和更新语句中完全被忽略。
同样,UserCreated 和 DateCreated 也应该排除在 Update 操作中。
但是当我试图捕获发送到服务器的 SQL 脚本时,这些值包含在生成的 SQL 中,这导致我出现 DateTime 溢出、不接受 Null 值等错误,等..
在 SQL Profiler
中生成了 SQL 脚本exec sp_executesql N'INSERT [dbo].[Events]([Title], [Detail], [StartDate], [StartTime], [EndTime], [CategoryID], [Campus], [Location], [DateCreated], [UserCreated], [DateModified], [UserModified], [state], [IsPosted])
VALUES (@0, @1, @2, @3, @4, @5, @6, NULL, @7, @8, NULL, NULL, @9, @10)
SELECT [EventID]
FROM [dbo].[Events] WHERE @@ROWCOUNT > 0 AND [EventID] = scope_identity()',
N'@0 varchar(1000),@1 varchar(4000),@2 datetime2(7),@3 time(7),@4 time(7),@5 varchar(10),@6 varchar(100),@7 datetime2(7),@8 varchar(50),@9 tinyint,@10 bit',@0='Football',
@1='Welcome to <strong>Football </strong>Match',@2='2016-01-29 00:00:00',@3='07:00:00',@4='12:00:00',@5='GIG',@6='xxxx',@7='0001-01-01 00:00:00',@8='username',@9=0,@10=0
插入
在 DateCreated 列上使用 [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 数据注释以使用数据库生成的默认值。
https://msdn.microsoft.com/en-us/data/jj591583.aspx#DatabaseGenerated
更新
Entity Framework只更新修改字段,所以根本不改变UserCreated的值,它不会被更新。
当插入或更新时,只需省略您不想更新或插入的字段,如下所示
[HttpPost]
public ActionResult Index(TimeSpan StartTime, TimeSpan EndTime, string CategoryID, string Campus, string Location, DateTime DateModified, string UserModified,
byte State, bool IsPosted)
{
var yourDbContext = new yourDbContext();
Events events = new Events();
events.StartTime=StartTime;
events.EndTime=EndTime;
events.CategoryID=CategoryID;
events.Campus=Campus;
events.Location =Location;
events.DateModified=DateModified;
events.UserModified=UserModified;
events.State= State;
events.IsPosted= IsPosted;
//Inserting
try
{
yourDbContext.Events.Add(events);
yourDbContext.SaveChanges();
return Json("Inserted", JsonRequestBehavior.AllowGet);
}
catch (Exception e)
{
return Json(e.ToString(), JsonRequestBehavior.AllowGet);
}
//end of inserting
//Updating
try
{
yourDbContext.Entry(events).State = EntityState.Modified;
yourDbContext.SaveChanges();
return Json("Updated", JsonRequestBehavior.AllowGet);
}
catch (Exception e)
{
return Json(e.ToString(), JsonRequestBehavior.AllowGet);
}
//End of updating
}
在视图上显示数据时,只需根据事件模型生成强类型视图
这也可以在控制器中实现。
创建
在create方法中可以设置CreatedBy和CreatedOn的值。
CreatedOn = DateTime.Now;
CreatedBy = User.Identity.Name; //In case of Windows authentication else user name can be taken from the db
ModifiedOn = null;
ModifiedBy = null;
更新
在更新中,您可以再次设置 ModifiedBy 和 ModifiedOn 的值,如上并保留 CreatedBy 和 CreatedOn,可以添加以下内容
events.ModifiedOn = DateTime.now;
events.ModifiedBy = User.Identity.Name;
db.Entry(events).State = EntityState.Modified;
db.Entry(events).Property("CreatedOn").IsModified = false;
db.Entry(events).Property("CreatedBy").IsModified = false;