C# “的属性”;“属性不可更新”;
我有一个应用程序(webservice),其中许多对象被插入数据库或更新(使用C# “的属性”;“属性不可更新”;,c#,entity-framework,C#,Entity Framework,我有一个应用程序(webservice),其中许多对象被插入数据库或更新(使用实体框架),但从不读取。所以我甚至没有这个数据库的读取权限。 现在,一个新的需求需要插入一些属性,但永远不会更新。我保存所有对象,如下所示: Type t = obj.GetType(); db.Set<TT>().AddOrUpdate(MapObject<TT>(obj)); //Maps to database entity and saves object [InsertOnly] p
实体框架
),但从不读取。所以我甚至没有这个数据库的读取权限。现在,一个新的需求需要插入一些属性,但永远不会更新。我保存所有对象,如下所示:
Type t = obj.GetType();
db.Set<TT>().AddOrUpdate(MapObject<TT>(obj)); //Maps to database entity and saves object
[InsertOnly]
public string SomeText { get; set; }
var modifiedItems = _dbContext.ChangeTracker.Entries()
.Where(x => x.State == EntityState.Modified)
.ToList();
在您的
工作单元
保存例程中,选中ChangeTracker
并删除标记为更新的记录或属性。大概是这样的:
Type t = obj.GetType();
db.Set<TT>().AddOrUpdate(MapObject<TT>(obj)); //Maps to database entity and saves object
[InsertOnly]
public string SomeText { get; set; }
var modifiedItems = _dbContext.ChangeTracker.Entries()
.Where(x => x.State == EntityState.Modified)
.ToList();
EntityState
具有以下类型:
- 独立的
- 不变的
- 增加
- 删除
- 修改
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
db.Set().AddOrUpdate(MapObject(obj))//映射到数据库实体和
包括以下内容(这是伪代码,不要期望它运行)
foreach(t.GetProperties()中的属性信息pi)
{
if(pi.GetCustomAttribute()==null)
{
//您可以安全地更新此属性
}
其他的
{
//此属性仅用于插入
}
}
我不确定是否可以通过属性的部分类重载添加自定义属性?这可能值得一试?据我在MSDN中看到的,
DbSet
有一个名为Add
的方法,只用于添加。而且没有AddOrUpdate
方法:因此只调用Add
方法也是一种安全的方法。ChangeTracker
也可以用于查找属性的状态,如果它能提供帮助的话。此链接可能会有所帮助:非常感谢!学到了一些新东西,为我指明了正确的方向!EF中没有这样的属性(特性)。还要注意的是,为了检测正确的操作(INSERT
或UPDATE
),AddOrUpdate
方法确实从数据库中读取数据,所以“我甚至没有对此数据库的读取权限”语句毫无意义。