【问题标题】:EF CF Read-Only version of an Entity [duplicate]实体的EF CF只读版本[重复]
【发布时间】:2013-03-29 02:20:13
【问题描述】:

我正在寻找一种方法来创建我将用作参考对象的实体的只读(或不可变)版本。 例如

class Order
{
   public int OrderId {get; private set;}

   public virtual Product ProductOrdered{get;set;}
   public int ProductId {get;set;}

   public int Quantity{get;set;}
}

class Product
{
    public int ProductId { get; set; }
    public string Name { get; set; }
    public string Category { get; set; }
}

在上面的示例中,产品应该用作参考数据。即,不应使用产品作为订单中的参考的代码修改产品。

现在,我意识到一种强制执行的方法是将所有设置器设为私有,并且没有人能够更改 Product...

class ProductReadOnly
{
    public int ProductId { get; private set; }
    public string Name { get; private set; }
    public string Category { get; private set; }
}

但在我的应用程序的某个地方,我希望管理员能够创建/修改产品。所以,我可以使用 Product 类(带有公共设置器)

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

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

【问题讨论】:

  • 尝试 google 或在 Stackoverflow 上搜索你会发现很多类似的问题和答案。

标签: c# .net entity-framework ef-code-first readonly


【解决方案1】:

无需像您的解决方案一样保留两个实体。您可以在上下文中覆盖 SaveChanges 并为此类产品禁用/启用编辑/添加。

    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();
    }

如果当前用户不是管理员,我已禁用保存产品实体的更改。否则,如果修改/添加了 Product 类型的任何条目,您可能会抛出错误

【讨论】:

  • 这看起来是正确的,但感觉像是解决问题的错误方法。
  • 谢谢。而不是依赖于登录用户,我希望这基于应用程序的功能。我正在尝试找出一个可以全面应用的基于设计的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多