Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.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# “的属性”;“属性不可更新”;_C#_Entity Framework - Fatal编程技术网

C# “的属性”;“属性不可更新”;

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

我有一个应用程序(webservice),其中许多对象被插入数据库或更新(使用
实体框架
),但从不读取。所以我甚至没有这个数据库的读取权限。
现在,一个新的需求需要插入一些属性,但永远不会更新。我保存所有对象,如下所示:

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
方法确实从数据库中读取数据,所以“我甚至没有对此数据库的读取权限”语句毫无意义。