【问题标题】:Attribute for "Property not updateble"“属性不可更新”的属性
【发布时间】:2017-11-06 17:11:01
【问题描述】:

我有一个应用程序(网络服务),其中许多对象被插入数据库或更新(使用Entity Framework),但从未读取。所以我什至没有对该数据库的读取权限。
现在一个新的需求想要一些属性被插入但永远不会被更新。我像这样保存所有对象:

Type t = obj.GetType();
db.Set<TT>().AddOrUpdate(MapObject<TT>(obj)); //Maps to database entity and saves object

现在的问题是,如果有一个属性我可以告诉一个属性被插入,但在更新时被忽略?最好的情况是这样的:

[InsertOnly]
public string SomeText { get; set; }

【问题讨论】:

  • EF中没有这样的属性(特征)。另请注意,为了检测正确的操作(INSERTUPDATE),AddOrUpdate 方法确实从数据库中读取,所以“我什至没有读取权限到这个数据库” 语句没有意义。

标签: c# entity-framework


【解决方案1】:

在您的unit of work 保存例程中,检查ChangeTracker 并删除那些标记为更新的记录或属性。像这样的:

var modifiedItems = _dbContext.ChangeTracker.Entries()
    .Where(x => x.State == EntityState.Modified)
    .ToList();

EntityState 有以下类型:

  • 分离
  • 不变
  • 已添加
  • 已删除
  • 修改

【讨论】:

  • 据我在 MSDN 中看到的,DbSet 有一个名为 Add 的方法,仅用于添加。而且没有AddOrUpdate 方法:msdn.microsoft.com/en-us/library/… 所以只调用Add 方法也是一种安全的方法。
  • ChangeTracker 也可用于查找属性状态,如果有帮助的话。
  • 此链接可能有帮助:stackoverflow.com/questions/12661881/…
  • 非常感谢!学到了一些新东西,并为我指明了正确的方向!
【解决方案2】:

您可以添加自定义属性。

public class InsertOnly : Attribute
{}

如果我们考虑

在您的 EF 对象上,您可以这样添加自定义属性:

public class SomeEFClass {
       [InsertOnly]
       public int Id {get;set;}
   }

那就换

db.Set<TT>().AddOrUpdate(MapObject<TT>(obj)); //Maps to database entity and 

要包括类似的东西(这是伪代码,不要指望它会运行)

foreach(Property info pi in t.GetProperties())
{
    if(pi.GetCustomAttribute<InsertOnly>() == null)
    {
        //You can safely update this property
    }
    else
    {
        //This property is only for inserting
    }
}

我不确定您是否可以通过属性的部分类重载来添加自定义属性?这可能值得一试?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2014-04-23
    • 2015-12-15
    • 2013-11-02
    • 1970-01-01
    • 2011-12-08
    相关资源
    最近更新 更多