我正在寻找一种方法来创建我将用作参考对象的实体的只读(或不可变)版本。 e.g。
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映射到产品表)
答案 0 :(得分:2)
无需像您的解决方案那样保留两个实体。您可以在上下文中覆盖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