是否有任何方法将实体标记为只读并且不为其指定任何密钥?实体框架代码第一个只读实体
回答
在Code First中,您可以执行几项操作来强制执行只读。首先是在查询时使用AsNoTracking()
。
var readOnlyPeople = (from p in context.People
where p.LastName == "Smith"
select p).AsNoTracking();
这告诉代码第一次不跟踪更改这些实体,所以当你打电话SaveChanges()
没有对这些对象所做的更改将是持久的。
在调用SaveChanges()
之前,您可以执行的第二件事是将状态设置为Unchanged
。
context.Entry(person).State = EntityState.Unchanged;
context.SaveChanges();
这告诉Code First忽略对该实体所做的任何更改。
只要没有密钥,所有实体都必须有密钥。这可能不一定映射到数据库中的主键,但它“必须唯一标识实体集内的实体类型实例”。
嗨布里斯,你的建议对我来说不是理想的解决方案(我真的更喜欢只是将该实体标记为只读 - 它存在于NH中),但我不认为我想要的是EF中一个整洁的解决方案。按照“所有实体都必须拥有钥匙”,我赞同你的看法,但有时你必须使用某些观点,而且他们没有任何钥匙,如果我可以将entitiy标记为只读,为什么我需要钥匙。 – Otake 2012-03-09 09:33:52
其实你可以使用一个类似于这里建议的ICacheableEntity接口的IReadOnlyEntity标记接口(有博客文章描述这个以及我最初发现的代码,但我找不到它们)http://stackoverflow.com/a/ 6593261/34474你应该考虑一些关于它们之间的关系的问题(如果有人有兴趣,让我知道)最后,我们正在以更自动化的方式来做Brice建议的事情。 – Cohen 2012-12-26 11:33:47
如果您的视图没有自然键,您可以添加一个以帮助EntityFramework。 在视图定义: SELECT \t NEWID()为[VirtualKey] ... 在实体的地图: //主键 this.HasKey(T => t.VirtualKey); – Elton 2017-02-15 16:38:34
在EF6中使用代码优先,我创建了一些反映视图的实体,显然不应该修改或保存。要防止实体被改变了,我用的保护套属性:
public class TransplantCenterView
{
public string TransplantsThisYear { get; protected set; }
}
实体框架依然能够设置该属性,但其他开发人员可以不小心做没有一个编译时错误。这很好,但似乎更好的解决方案是完全消除跟踪。
感谢reggaeguitar's answer,它似乎有一个答案(请投他的答案了,如果下面是有帮助的),这也使我从改变我的代码:
public class MyContext : DbContext
{
public DbSet<TransplantCenterVeiw> TransplantCenterViews {get; set;}
}
要:
public class MyContext : DbContext
{
//appears the DbSet is still needed to make Set<Entity>() work
protected DbSet<TransplantCenterView> _transplantCenterViews {get; set;}
//this .AsNoTracking() disables tracking for our DbSet.
public DbQuery<TransplantCenterView> TransplantCenterViews {
get { return Set<TransplantCenterView>().AsNoTracking(); }
}
}
我不知道有什么利弊,这一点,但我现有的代码继续没有任何扯起工作,所以似乎胜利。
查看我的答案,以禁用对实体的跟踪。 – reggaeguitar 2017-08-16 19:30:37
Devs _仍然可以调用MyContext.Set
如果你想为只读整个实体,你可以做到这一点
/// Using a dbquery since this is readonly.
/// </summary>
public DbQuery<State> States
{
get
{
// Don't track changes to query results
return Set<State>().AsNoTracking();
}
}
源http://www.adamtuliper.com/2012/12/read-only-entities-in-entity-framework.html
将DbSet更改为DbQuery。如上所述更改吸气剂。编译。都好。但是,当我去执行从视图加载数据的页面时,我得到一个运行时错误:“实体类型MyEntityName不是当前上下文模型的一部分。”所以,增加了'protected DbSet
有趣的是,我没有得到那个错误。我正在映射到表格而不是视图,也许这是区别? – reggaeguitar 2017-08-17 16:41:43
嗯...所以,你的上下文中没有DbSet
- 1. 设计代码第一个实体框架实体框架
- 2. 实体框架代码第一
- 3. WPF和实体框架代码第一
- 4. 嘲讽代码第一实体框架的实体
- 5. 实体框架代码第一个默认的SQL Server实例?
- 6. 只请求第一项实体框架
- 7. 代码只在实体框架
- 8. 实体框架代码第一个 - 共享的一对多实体
- 9. 实体框架 - 代码第一个关系:一对一个
- 10. 实体框架代码第一个双一对一的关系
- 11. VB.NET示例实体框架4.2代码第一个实体拆分
- 12. 实体框架4.1代码优先:多对多ICollection只有一个实体
- 13. 实体框架代码是否第一次支持只读导航属性
- 14. 实体框架代码第一个级联删除一对多
- 15. 实体框架 - 代码第一 - 一个与共享主键
- 16. 实体框架代码第一个DbConfiguration为多个数据库
- 17. 实体框架代码第一个和多个程序集
- 18. 实体框架代码第一个默认数据库位置
- 19. 代码第一个实体框架继承
- 20. 实体框架代码第一个函数
- 21. 实体框架代码第一个CTP5映射
- 22. 实体框架代码第一个计算属性
- 23. 实体框架代码第一个错误
- 24. 实体框架代码第一个原始集合
- 25. 使用代码第一个实体框架初始化类
- 26. 实体框架代码第一个TPH鉴别器列
- 27. 实体框架代码第一个表层次
- 28. ASP.NET实体框架代码gridview上的第一个外键
- 29. 实体框架4.1代码第一个TPC问题
- 30. 实体框架代码第一个0到1的映射
代码第一次和只读是一种相互排斥的。出于好奇,为什么你不想要一个主键? – Brian 2012-02-23 15:01:03
Enttity映射到一个视图,我不想更新/插入它,也没有关键。 – Otake 2012-02-23 15:32:42
默认情况下,EF不会对视图进行更新。 – 2012-02-23 16:00:45