我正在 Visual Studio 2012 中开发一个 MVC 4 (C#) 项目。我正在使用 Entity Framework ,该框架利用 *.edmx 文件对现有数据库进行建模。我的目标是实现数据库审计以跟踪对数据库所做的任何更改。类是使用数据库表中的字段自动生成的 - 我相信这是相当标准的东西。
我在尝试检索这些生成的类的主键时遇到了问题。 Entity Framework 不会将 [Key] 属性分配给类属性。我尝试通过扩展创建的部分类并自己分配此属性来解决此问题。直接将其添加到生成的类中效果很好。如果我尝试“buddy class”方法,稍后在代码执行中会收到以下错误:“Entity {Class Name} has no [Key] attribute。”
自动生成的类:
public partial class List
{
public List()
{
this.Tasks = new HashSet<Task>();
}
public int Id { get; set; }
public string ListName { get; set; }
}
扩展(伙伴)类:
[MetadataType(typeof(ListMetaData))]
public partial class List
{
private class ListMetaData
{
[Key]
public int Id { get; set; }
}
}
代码片段:
var property = dbEntry.Entity.GetType().GetProperties().FirstOrDefault(
p => p.GetCustomAttributes(typeof(KeyAttribute), true).Any());
if (property == null)
throw new InvalidOperationException(string.Format(
"Entity {0} has no [Key] attribute.", dbEntry.Entity.GetType().Name));
string keyName = property.Name;
我正在重写 DbContext 中的 SaveChanges() 方法来跟踪所做的更改。上面的代码片段显示了一个函数的部分代码,该函数检查 DbEntityEntry 对象 (dbEntry) 以获取主键。
最佳答案
List
类是 Entity Framework 类还是 ListMetaData
类?如果它是 List
类,则该类中的 Id
属性根本没有任何属性。嵌套的ListMetaData
类的Id
属性具有attribute,这是一个完全不同的属性。
如果您希望 ListMetaData
类具有该属性,我会在模型中添加该类的一个表(如果还没有),取消嵌套该类并制作公开。
关于c# - 将 [Key] 属性分配给 Entity Framework 生成的类 - MVC4 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20705586/