EntityFramework排除更新和插入中的某些字段

时间:2016-01-27 14:41:31

标签: asp.net-mvc-5 mapping field entity-framework-5

这是我有史以来第一个使用Entity Framework的项目,我想忽略Insert,Update活动中的一些数据列。但是当我在视图上显示数据时,我仍然需要绑定它们。

在下图中,您可以在我的模型和表格结构中看到一些代码

enter image description here

在SQL Server,DateCreated中,我将它的默认值设置为'GETDATE()',并且应该在Insert和Update语句中忽略它。

同样,UserCreated和DateCreated也应该在Update操作中排除。

但是当我试图捕获发送到服务器的SQL脚本时,这些值包含在生成的SQL中,它导致我出现像DateTime溢出,Null值不被接受等错误。

SQL事件探查器中生成的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

3 个答案:

答案 0 :(得分:2)

当插入或更新时,请忽略您不想更新或插入的字段,如下所示

 [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   

    }

在视图上显示数据时,只需根据事件模型生成强类型视图

答案 1 :(得分:1)

插入

在DateCreated列上使用[DatabaseGenerated(DatabaseGeneratedOption.Computed)]数据注释,以使用数据库生成的默认值。

https://msdn.microsoft.com/en-us/data/jj591583.aspx#DatabaseGenerated

<强>更新

实体框架仅更新已修改的字段,因此只需更改UserCreated的值,它就不会更新。

答案 2 :(得分:0)

这也可以在控制器中实现。

创建

在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;