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;