Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体的EF CF只读版本_C#_.net_Entity Framework_Ef Code First_Readonly - Fatal编程技术网

C# 实体的EF CF只读版本

C# 实体的EF CF只读版本,c#,.net,entity-framework,ef-code-first,readonly,C#,.net,Entity Framework,Ef Code First,Readonly,我正在寻找一种方法来创建一个只读(或不可变)版本的实体,我将使用它作为引用对象。 e、 g 在上述示例中,产品应用作参考数据。i、 e.不得使用订单中产品作为参考的代码修改产品 现在,我意识到一种强制执行的方法是让所有的设定者都是私有的,没有人能够改变产品 class ProductReadOnly { public int ProductId { get; private set; } public string Name { get; private set; } p

我正在寻找一种方法来创建一个只读(或不可变)版本的实体,我将使用它作为引用对象。 e、 g

在上述示例中,产品应用作参考数据。i、 e.不得使用订单中产品作为参考的代码修改产品

现在,我意识到一种强制执行的方法是让所有的设定者都是私有的,没有人能够改变产品

class ProductReadOnly
{
    public int ProductId { get; private set; }
    public string Name { get; private set; }
    public string Category { get; private set; }
}
但在我的应用程序中,我希望管理员能够创建/修改产品。因此,我可以使用类产品(使用公共setter)

现在问题是(假设我能够使用table属性将Product&ProductReadOnly映射到Product表)

  • 我能否将ProductReadOnly用作Order类中的导航属性
  • 我是否可以在相同的数据上下文中加载Product&ProductReadOnly(相同的产品)
  • 有没有更简单的方法(分离对象?)
  • 这种方法有什么问题吗

  • 无需像您的解决方案那样保留两个实体。您可以覆盖上下文中的保存更改,并禁用/启用此类产品的编辑/添加

        public override int SaveChanges()
        {
          if(currentUserIsNotAnAdmin){
          var entries= ObjectStateManager.GetObjectStateEntries(EntityState.Added |   
       EntityState.Modified).OfType<Product>() ;
            foreach(entry in entries){//or throw an error here
              this.Entry(entry).State=System.Data.EntityState.Unchanged
            }
          }
            return base.SaveChanges();
        }
    
    public override int SaveChanges()
    {
    如果(CurrentUserIsNotaAdmin){
    var entries=ObjectStateManager.GetObjectStateEntries(EntityState.Added |
    EntityState.Modified)。of type();
    foreach(entry in entries){//或在此处抛出错误
    this.Entry(Entry).State=System.Data.EntityState.Unchanged
    }
    }
    返回base.SaveChanges();
    }
    

    在这里,如果当前用户不是管理员,我已禁用保存产品实体的更改。或者,如果有任何类型为
    产品

    的条目被修改/添加,您可能会抛出一个错误。尝试通过google或Stackoverflow搜索,您将看到许多类似的问题和答案。这看起来是正确的,但感觉是解决问题的错误方法。谢谢。我希望这是基于应用程序的功能,而不是依赖于登录的用户。我正试图找出一个基于设计的解决方案,可以全面应用。
        public override int SaveChanges()
        {
          if(currentUserIsNotAnAdmin){
          var entries= ObjectStateManager.GetObjectStateEntries(EntityState.Added |   
       EntityState.Modified).OfType<Product>() ;
            foreach(entry in entries){//or throw an error here
              this.Entry(entry).State=System.Data.EntityState.Unchanged
            }
          }
            return base.SaveChanges();
        }