C# 实体框架onchange保护主键

C# 实体框架onchange保护主键,c#,sql,entity-framework,C#,Sql,Entity Framework,我在实现一个检查时遇到了一个问题,该检查阻止开发人员在初始创建之后手动或以编程方式更新代码中的主键 partial class User { public User() { this.UserId = sGuid.NewSGuid(sGuidType.SequentialAtEnd); } partial void OnUserIdChanging(Guid value) { //throw if its an edit

我在实现一个检查时遇到了一个问题,该检查阻止开发人员在初始创建之后手动或以编程方式更新代码中的主键

 partial class User
{
    public User()
    {
        this.UserId = sGuid.NewSGuid(sGuidType.SequentialAtEnd);
    }

    partial void OnUserIdChanging(Guid value)
    {
        //throw if its an edit...
        throw new DbEntityValidationException("Cannot mutate primary key");
    }

}
如果我正在编辑/更新一个对象,这很好,但它实际上不允许我首先创建一个新实体。在这一点上,我有没有办法检查它是新实体还是现有实体

提前感谢,, 皮特

更新:

典型的是,我总是在发布后找到答案!谢谢你的回答,伙计,我会把你的一个答案标记为正确答案,因为它们是有效的选择

if (this.EntityState != System.Data.EntityState.Detached)
{
    throw new DbEntityValidationException("Cannot mutate primary key");
}

此问题通常通过使主键设置器
私有
受保护
来解决:

public class MyEntity
{
  public int Id { get; private set; }
}

如果您使用的是EF designer,只需在designer中选择property,并在property grid中设置适当的访问修饰符,您的代码生成器将完成其余工作。

您可以使用键查询数据库,如果有编辑,如果没有,则为新对象。。。或者我搞错了什么?为什么不让你的用户ID设置程序私有化呢?我确实想到了这一点(只是将其设置为私有),这是可行的。但这并不能阻止他们生成可以更新它的类方法。但我想这可能不会阻止他们完全取消支票。在OnChange事件中,您只需获取新值,如果手动设置,您可能会与错误记录发生冲突等。我之所以要避免将其设置为私有,是因为我使用了自动代码生成,并且每次更新模型时它都会被销毁>您好,请参阅上面的注释,我想我希望在OnChange事件中消除任何人更新类内部方法和做愚蠢事情的可能性。但如果没有办法,我想我别无选择:(@PeterLea你应该更关注于警告开发者他们做错了什么(如果他们不得不修改内部方法的事实还不够清楚,没有什么比这更重要的了),那就是试图彻底消除愚蠢。我向你保证,后者是一项不可能完成的任务。)