- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在尝试创建一个审计跟踪,尝试通过 TrackChanges、覆盖 SaveChanges()
并使用 DbEntityEntry 获取实体并获取原始值.OriginalValues
所有这些方法最终归结为同一个问题。当我将另一个模型引用为 ICollection
时,它不会在实体中记录该模型。作为对此问题的非常基本的解释,请参阅以下代码:
public void Update(Project project)
{
_ctx.OriginalValues(project);
_ctx.Projects.Attach(project);
_ctx.Entry(project).State = EntityState.Modified;
_ctx.SaveChanges(project);
}
上面的 .OriginalValues
在调用保存更改之前将实体传递给此方法,并且我能够在用户更改之前读取实体中的值。 OriginalValues
方法如下所示:
public void OriginalValues(object entity)
{
var entry = this.Entry(entity);
System.Reflection.PropertyInfo[] names = entity.GetType().GetProperties();
foreach (var property in names)
{
var n = entry.OriginalValues[property.Name];
}
}
我理解的上述方法不是很优雅或最佳实践,但它是从我的实体读取原始值的长期尝试中的最新尝试。
当此代码运行时,property.Name
将获得名为“Teams”的名称,该名称在项目模型中被引用:
public class Project
{
public int Id { get; set; } // PK
public string Name { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public int MarketId { get; set; } // FK
[ForeignKey("MarketId")]
public Market Market { get; set; } // FK Nav
public ICollection<Team> Teams { get; set; } // Many to Many Nav
}
抛出一个错误,告诉我它还没有映射到项目,即使我已经使用流畅的 API 和数据注释来尝试并为此获取映射。
这是一个示例,我在其他模型中遇到了相同的情况,但存在多对多关系。
我是一名研究生开发人员,因此没有大量接触 .net 我希望有人可以在可能的情况下提供任何建议或支持!
谢谢
编辑:显示的错误信息:
The 'Teams' property does not exist or is not mapped for the type 'Project'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.ArgumentException: The 'Teams' property does not exist or is not mapped for the type 'Project'.
Source Error:
Line 78: foreach (var property in names)
Line 79: {
Line 80: var n = entry.OriginalValues[property.Name];
Line 81:
Line 82: }
最佳答案
出现此错误是因为 EF 将每个条目的值保存在它自己的对象中,因此导航属性的值将保存在它们的条目中,因此它们不在当前对象的 OriginalValues
中.您可以像这样访问导航属性:
foreach (var property in names)
{
var m = entry.Member(property.Name);
if (m is DbPropertyEntry)//simple property
{
var p = entry.Property(property.Name);
}
if (m is DbReferenceEntry)//navigation to single object
{
var r = entry.Reference(property.Name);
}
if (m is DbCollectionEntry)//navigation to collection
{
var c = entry.Collection(property.Name);
}
}
然后您可以将每个导航对象视为新对象并检索它们的原始值。
建议:EF 内部有一个跟踪系统,可以跟踪对对象图所做的所有更改,您可以查询此跟踪系统并记录更改,就像这样。无需跟踪引用,因为如果它们发生变化,EF 会检测到它。
public void OriginalValues(object entity)
{
ChangeTracker.DetectChanges();
var changed = ChangeTracker.Entries()
.Where(x=>x.State != EntityState.Unchanged).ToList();
foreach (var entry in changed)
{
switch (entry.State)
{
case EntityState.Added:
Debug.WriteLine("object of type " + entry.Entity.GetType().Name
+ "created:");
foreach(var name in entry.CurrentValues.PropertyNames)
{
Debug.WriteLine(name + " : " + entry.CurrentValues[name]);
}
break;
case EntityState.Deleted:
Debug.WriteLine("object of type " + entry.Entity.GetType().Name
+ "deleted:");
foreach(var name in entry.OriginalValues.PropertyNames)
{
Debug.WriteLine(name + " : " + entry.OriginalValues[name]);
}
break;
case EntityState.Modified:
Debug.WriteLine("object of type " + entry.Entity.GetType().Name
+ "updated:");
Debug.WriteLine("current values:");
foreach(var name in entry.CurrentValues.PropertyNames)
{
Debug.WriteLine(name + " : " + entry.CurrentValues[name]);
}
Debug.WriteLine("original values:");
foreach(var name in entry.OriginalValues.PropertyNames)
{
Debug.WriteLine(name + " : " + entry.OriginalValues[name]);
}
break;
}
}
}
注意:确保在删除对象时将状态设置为Deleted
。
关于c# - Entity Framework Code First Auditing 多对多和一对多问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32120315/
目前,我正在为网络开发类(class)做作业。 这些是说明:第一行和首字下沉样式Jakob 希望文章的第一行以小写大写字母显示。转到 First Line and Drop Cap Styles 部分
.first() 方法是在 jQuery 1.4 中添加的。 :first 选择器自 1.0 以来就已存在。 来自文档: :first The :first pseudo-class is equiv
我正在审查现有的 ASP.NET MVC (5.2.3) EF (6.1.3) 项目。 该项目使用 ASP.NET Identity,我检查了 web.config 中的 2 个连接字符串,一个用于
为什么人们使用 mid=first+(last-first)/2 而不是 (first+last)/2,在二进制搜索的情况下)两者有区别吗。如果有,请告诉我,因为我无法理解其中的区别。 最佳答案 如果
为什么人们使用 mid=first+(last-first)/2 而不是 (first+last)/2,在二进制搜索的情况下)两者有区别吗。如果有,请告诉我,因为我无法理解其中的区别。 最佳答案 如果
for(auto it = M.begin(); it!=M.end();it++) { coutfirstsecondsecond == 1) return it->firs
我试图从第二个循环中获取循环的第一项。 我知道我得到了这样的@key @../key 但@first 似乎不像@../first 那样工作 有什么想法吗? 问候 最佳答案 首先,无论是否在嵌套 blo
var tab1 = $('.tabs a:first-child').attr('href'); alert(tab1); .. 尽管同一页面上有两个 div.switch,但仅匹配一个。第二个位于
我想知道如何将节点*变量 NODE 分配给结构内的数据? struct node { int info; struct node *link; }; typedef struct nod
我有两个段落包含在一个 div 中。我想让第一段的文字变大一点,但使用 :first-child 并不能像我所说的那样工作。看不出有什么问题。
我有一个 ul li 列表 Parent child1 child2
我有三个表,即员工、部门和申诉。 Employees 表有超过一百万条记录。我需要找到员工的详细信息、他/她的部门以及他/她提出的申诉。 我可以想到以下两个查询来查找结果: 1。先过滤记录,只获取需要
我有三个表,即员工、部门和申诉。 Employees 表有超过一百万条记录。我需要找到员工的详细信息、他/她的部门以及他/她提出的申诉。 我可以想到以下两个查询来查找结果: 1。先过滤记录,只获取需要
这有什么区别吗: myList.Where(item => item == 0).First(); 还有这个: myList.First(item => item == 0); 后者对我来说更有意义,
我分不清 element:first-child 之间的区别和 element:first-of-type 例如,你有一个 div div:first-child → 全部 元素是其父元素的第一个子元
当我遇到一个奇怪的情况时,我正在研究 CSS 选择器。 如果我使用 :first-child 伪元素,我需要在它前面加上一个空格才能工作,否则它将无法工作。然而 :first-letter 伪元素的情
请考虑以下字符串数组: let strings = ["str1", "str2", "str10", "str20"] 假设需要获取包含 5 个字符的第一个元素 (String),我可以使用 fil
让我们假设我们要开始新项目 - 包含一些业务逻辑的应用程序、ASP.NET 上的用户界面、WPF 或两者。我们想使用 ORM 或 DAL 代码生成器并在 .NET 类中实现我们的业务逻辑。我们可以通过
我有一种树系统。我想做的是给所有 parent 一个 margin ,除了第一个。这是我的 HTML: Test
我分不清 element:first-child 之间的区别和 element:first-of-type 例如,你有一个 div div:first-child → 全部 元素是其父元素的第一个子元
我是一名优秀的程序员,十分优秀!