Entity framework 实体框架MapToStoredProcess更新并更新对象的每个字段

Entity framework 实体框架MapToStoredProcess更新并更新对象的每个字段,entity-framework,stored-procedures,mapping,Entity Framework,Stored Procedures,Mapping,我有一个BaseEntity: public class BaseEntity : IBaseEntity { [ScaffoldColumn(false)] public string ID { get; set; } [ScaffoldColumn(false)] public DateTime CreatedOn { get; set; } [ScaffoldColumn(false)] public bool Deleted { get

我有一个
BaseEntity

public class BaseEntity : IBaseEntity
{
    [ScaffoldColumn(false)]
    public string ID { get; set; }

    [ScaffoldColumn(false)]
    public DateTime CreatedOn { get; set; }

    [ScaffoldColumn(false)]
    public bool Deleted { get; set; }
}
以及个人或实体:

public class People : BaseEntity
{ //Fields }
我想用存储过程进行更新、插入和删除,因此在我的上下文中,请执行以下操作:

modelBuilder.Entity<People>()
    .MapToStoredProcedures();
但当执行更新时,存储过程将运行并为
@createdOn
参数设置默认值,并返回异常


如何使用
MapToStoredProcedures
而不是更新每一列?

您能让数据库为您设置值吗

public class BaseEntity : IBaseEntity
{
    [ScaffoldColumn(false)]
    public string ID { get; set; }

    [ScaffoldColumn(false)]
    [DatabaseGeneratedOption(DatabaseGeneratedOption.Computed)]
    public DateTime CreatedOn { get; set; }

    [ScaffoldColumn(false)]
    public bool Deleted { get; set; }
}
然后您的更新过程甚至不应该传递参数。在更新存储过程中,将CreatedOn的值设置为GETDATE()、GETUTCDATE(),或者如果不使用SQL Server,则在数据库中设置日期值的任何值

这里的想法是,设置DatabaseGenerated选项告诉EntityFramework它不需要将该参数发送到进程,因为数据库将生成该列/属性的值。您必须记住,存储的proc必须在其resultset中返回该列——但它只能使用该列的默认值,该列是在proc中生成的

如果执行此操作,甚至不需要对SaveChanges进行覆盖以设置默认值,该值将在SaveChanges()之后为您设置


仅供参考:这里是Entity Framework 6.x。

您能让数据库为您设置值吗

public class BaseEntity : IBaseEntity
{
    [ScaffoldColumn(false)]
    public string ID { get; set; }

    [ScaffoldColumn(false)]
    [DatabaseGeneratedOption(DatabaseGeneratedOption.Computed)]
    public DateTime CreatedOn { get; set; }

    [ScaffoldColumn(false)]
    public bool Deleted { get; set; }
}
然后您的更新过程甚至不应该传递参数。在更新存储过程中,将CreatedOn的值设置为GETDATE()、GETUTCDATE(),或者如果不使用SQL Server,则在数据库中设置日期值的任何值

这里的想法是,设置DatabaseGenerated选项告诉EntityFramework它不需要将该参数发送到进程,因为数据库将生成该列/属性的值。您必须记住,存储的proc必须在其resultset中返回该列——但它只能使用该列的默认值,该列是在proc中生成的

如果执行此操作,甚至不需要对SaveChanges进行覆盖以设置默认值,该值将在SaveChanges()之后为您设置


仅供参考:此处为Entity Framework 6.x。

您是否试图阻止人们更改“CreatedOn”属性?例外情况是什么?我认为,如果您确定
.IsModified==true
或以某种方式获取现有条目并重置为原始值(事务中存在大量开销和死锁的危险),则可能必须抛出异常。但是,您可能希望使用数据库检查约束或其他能够更好地处理所需情况的约束。或者告诉EF该列是一个
DatabaseGenerateOption.Computed
,并在插入时将其默认为GetDate()。您是否试图阻止人们更改“CreatedOn”属性?例外情况是什么?我认为,如果您确定
.IsModified==true
或以某种方式获取现有条目并重置为原始值(事务中存在大量开销和死锁的危险),则可能必须抛出异常。但是,您可能希望使用数据库检查约束或其他能够更好地处理所需情况的约束。或者告诉EF该列是一个
DatabaseGeneratedOption.Computed
,并在插入时将其默认为GetDate()。