如果我在我的模型中声明实体关系为虚拟,则不需要Include
在我的LINQ查询中使用该语句,对吧? -
例如:这是我的模型类:
public class Brand
{
public int BrandID { get; set; }
public string BrandName { get; set; }
public string BrandDesc { get; set; }
public string BrandUrl { get; set; }
public virtual ICollection<Product> Products { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在,对于上面的模型类,我不需要使用var brandsAndProduct = pe.Brands.Include("Products").Single(brand => brand.BrandID == 22);
.
相反,我可以使用简单的var brandsAndProduct = pe.Brands.Where(brand => brand.BrandID == 22);
,我将在访问时自动使相关实体可用.
我的理解是正确的吗?
另外,请告诉我在什么情况下我应该更喜欢一个?
我想知道实现事务的最佳方式是什么DBContext
.特别是,
DbContext.SaveChanges
如果我更改多个实体,是否实现事务内部?DbContext.SaveChanges
多次呼叫(相同的contxet /不同的contxets),如何实现交易?entity-framework transactions entity-framework-4.1 dbcontext
我研究了一些关于我可以用来对DbContext进行单元测试的技术的信息.我想在上下文中添加一些内存数据,以便我的测试可以针对它运行.我正在使用Database-First方法.
我发现最有用的两篇文章是这个和这个.该方法依赖于创建一个MyContext和FakeContext都将实现的IContext接口,允许模拟上下文.
但是,正如某些人所指出 的 那样,我试图避免使用存储库来抽象EF,因为EF 4.1已经通过DbSet和DbContext实现了存储库和工作单元模式,我真的想保留EF实现的所有功能.团队无需使用通用存储库维护它们,正如我在其他项目中所做的那样(这有点痛苦).
使用IContext会引导我走同一条路(或者不是吗?).
我考虑创建一个继承自主MyContext的FakeContext,从而利用它下面的DbContext来运行我的测试,而不需要访问数据库.我找不到类似的实现,所以我希望有人可以帮助我.
我做错了什么,或者这会导致我遇到一些我没想到的问题?
我正在使用System.ComponentModel.DataAnnotations
我的Entity Framework 4.1项目进行验证.
例如:
public class Player
{
[Required]
[MaxLength(30)]
[Display(Name = "Player Name")]
public string PlayerName { get; set; }
[MaxLength(100)]
[Display(Name = "Player Description")]
public string PlayerDescription{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我需要检索Display.Name
注释值以在消息中显示它,例如所选的"玩家名称"是Frank.
================================================== ===============================
我需要检索注释的另一个例子:
var playerNameTextBox = new TextBox();
playerNameTextBox.MaxLength = GetAnnotation(myPlayer.PlayerName, MaxLength);
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我Entity Framework 4.1
首先在代码中有一个简单的代码:
PasmISOContext db = new PasmISOContext();
var user = new User();
user.CreationDate = DateTime.Now;
user.LastActivityDate = DateTime.Now;
user.LastLoginDate = DateTime.Now;
db.Users.Add(user);
db.SaveChanges();
user.Avatar = new Avatar() { Link = new Uri("http://myUrl/%2E%2E/%2E%2E") };
db.SaveChanges();
db.Users.Add(new User() { Avatar = new Avatar() { Link = new Uri("http://myUrl/%2E%2E/%2E%2E") } });
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
问题是我收到了错误
保存不公开其关系的外键属性的实体时发生错误.EntityEntries属性将返回null,因为无法将单个实体标识为异常的来源.通过在实体类型中公开外键属性,可以更轻松地在保存时处理异常.有关详细信息,请参阅InnerException.
在
db.Users.Add(new User() { Avatar = new Avatar() { Link = new Uri("http://myUrl/%2E%2E/%2E%2E") } });
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
我不明白为什么类似的操作有效.我的模型或ef-code-first首先出现了问题吗?
public class Avatar
{
[Key]
public int Id { …
Run Code Online (Sandbox Code Playgroud) 如果这已经得到回答,请道歉,但如果您不使用IOC容器,如何保证每个请求有一个Entity Framework DbContext?(到目前为止,我遇到的答案涉及IOC容器解决方案.)
似乎大多数解决方案都挂钩到HttpContext.Current.Items
字典中,但是如何在请求完成时保证处理DbContext?(或者EF的处理不是绝对必要的DbContext
吗?)
编辑
我目前正在我的控制器中实例化和处理我的DbContext,但我在ActionFilters和我的MembershipProvider中也有几个单独的DbContext实例(我刚注意到,也有几个验证器).因此,我认为集中我的DbContext的实例化和存储以减少开销可能是个好主意.
asp.net-mvc entity-framework ef-code-first entity-framework-4.1 asp.net-mvc-3
所以,我的EF模型有关系,根据我在例子中看到的,这些关系应该用ICollection的虚拟属性来完成.
例:
public class Task
{
public int Id { get; set; }
public string Description { get; set; }
public virtual ICollection<SubTask> { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我在某处读到了我应该使用IEnumerable来防止延迟执行,这是正确的吗?这意味着如果我的DAL方法返回IEnumerable,仍然是IQueryable,那么SQL将在那一刻执行,而不是在我在网页中调用.TOList时.
那么,最佳做法是什么?我该怎么回事?IEnumerable,List?,IList,ICollection?
谢谢
在通过Entity Framework 4.1添加记录时,是否有直接的方法来检索数据库自动生成的主键?
例如:
dbcontext.Entity_Tables.Add(new Entity_Table { item1 = val1, item2 = val2 });
dbcontext.SaveChanges();
newPK = ???;
Run Code Online (Sandbox Code Playgroud)
SQL等价物将是:
newPK = executeOnDB("INSERT INTO Entity_Table (item1, item2) VALUES (val1, val2);SELECT @@Indentity";);
Run Code Online (Sandbox Code Playgroud)
顺便说一下,我使用的是MySQL,但SQL与MSSQL上的相同
我正在使用asp .net mvc 3,当我尝试在表中插入数据时,我遇到了包含2个主键的实体的问题.
public class LineItem
{
[Key]
public int OrderId { get; set;}
[Key]
public int LineNum { get; set;}
public string ItemId { get; set;}
public int Quantity { get; set;}
public decimal UnitPrice { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我尝试插入时出现此错误:
无法确定类型"ApplicationMVC3.Models.LineItem"的复合主键排序.使用ColumnAttribute或HasKey方法指定组合主键的顺序.
愿有人帮帮我!
我正在学习实体框架,我遇到了问题!
有人可以澄清我是否正确地认为我无法从数据库中获取父母及其子集的子集?
例如...
db.Parents
.Include(p => p.Children)
.Where(p => p.Children.Any(c => c.Age >= 5))
Run Code Online (Sandbox Code Playgroud)
这将返回所有有5岁以上孩子的父母,但如果我遍历Parents.Children集合,所有孩子都将在场(不仅仅是5岁以上的孩子).
现在查询确实对我有意义(我已经要求包含子项,我已经得到了它们!),但可以想象我想在某些场景中将where子句应用于子集合.
问题:
我找到了一些关于这个主题的博客和SO帖子,但没有什么能够解释我的小脑袋.
编辑
读过这个博客(感谢Daz Lewis).......我仍然没有得到它!
在博客中给出的示例中,我可以看到如何针对单个Parent实例实现它,但我正在努力弄清楚如何使用集合来实现它.
我怎么能得到一个IEnumerable,其中每个父母都有一个过滤的儿童集合(年龄> = 5)?
进一步澄清:
在回答DonAndre的评论时,我追问的是a)有5岁以上孩子的父母名单(仅包括那些孩子).
任何帮助,赞赏,
谢谢.