我在生成的部分类上有一个方法,如下所示:
var pChildren = this.Children
.Skip(skipRelated)
.Take(takeRelated)
.ToList();
Run Code Online (Sandbox Code Playgroud)
当我查看我的SQL Server时,我可以看到生成的代码正在执行SELECT *.* FROM Children此代码是直接从我的类中获取的,我已经验证了我的Skip/Take的顺序是在我的.ToList之前.
如果我删除.ToList,那行很快(并且没有SQL发送到我的数据库),但是当我尝试foreach结果时,我得到了发送到我的数据库的相同SQL : SELECT *.* FROM Children.
使用.Skip和.在我的实体的导航属性上有什么特别的东西需要做吗?
更新
我将尝试获取实际生成的SQL,我目前尚未设置.我找到了第一个,因为它出现在SSMS的"最近的昂贵查询"列表中.
运行这个:
var pChildren = this.Children
//.Skip(skipRelated)
//.Take(takeRelated)
.ToList();
Run Code Online (Sandbox Code Playgroud)
返回〜4,000,000行,需要约25秒.
运行这个:
var pChildren = this.Children
//.Skip(skipRelated)
.Take(takeRelated)
.ToList();
Run Code Online (Sandbox Code Playgroud)
返回〜4,000,000行,需要约25秒.
正如我所说,我将抓住为这些生成的SQL并将它们构建起来.
.net c# entity-framework navigation-properties sql-server-2008-r2
在带有Entity Framework的ASP .NET MVC 3中,我有一个域对象,它具有引用其他对象的导航属性,如下所示:
public class Person
{
public String Name {get;set;}
public Guid CompanyID{get;set;}
[ForeignKey(CompanyID)]
public virtual CompanyType Company{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我创建Person的实例并尝试将其添加到数据库时,DBContext会保留此实体"Person"的缓存并将其发送到数据库.所以稍后在同一个上下文实例的生命周期中,当我尝试访问此实体时,Company字段始终为null,因为导航属性永远不会更新.
有没有办法用数据库中存在的内容更新导航属性?
延迟加载已打开.
entity-framework navigation-properties ef-code-first asp.net-mvc-3 dbcontext
我想知道为什么有单独的方法来填充导航属性.
如果我在整套工作,我可以打电话Include给财产或集合.
但是,如果我处理单个实体,则根据项目是collection(Collection)还是单引用(Reference),有两种不同的方法可以调用.
有没有办法解决这个问题 - 这使得事情变得比我想象的更复杂.谁能解释为什么在设计EF时决定了这一点?
编辑
进一步研究,问题更深入.我试图做的是创建一种在单个实体上加载集合/导航属性的通用方法.使用Include可以在整个集合上轻松完成.但该方法的签名Reference和Collection略有不同.
没关系,将不得不在我的应用程序周围分散这些调用.
例如
dbSet<T>().Include(e => e.Property).Include(e => e.Collection).Include(e => e.Collection.Property)
Run Code Online (Sandbox Code Playgroud)
一切似乎都有效.
但是,对单个实体的调用是不同的:
context.Entry(entity).Reference(e => e.Property).Load();
context.Entry(entity).Reference(e => e.Property.Select(e => e.SubProperty)).Load();
context.Entry(entity).Collection(e => e.Collection).Load();
Run Code Online (Sandbox Code Playgroud) 我有下一个想法:
public class MyEntity
{
public virtual int Id { get; set; }
public virtual MySecondEntity SecondEntity { get; set; }
}
public class MySecondEntity
{
public virtual int Id { get; set; }
...
some properties here
...
}
Run Code Online (Sandbox Code Playgroud)
我不想创建MySecondEntityID属性以获得干净的模型.
我需要通过Id设置myEntity.MySecondEntity,但我不想从DB请求MySecondEntity.
是否可以在不创建MyEntity.MySecondEntityID属性且不加载整个MySecondEntity对象甚至没有任何db请求的情况下执行此操作?
c# entity-framework navigation-properties entity-framework-6
我在我的应用程序中使用Entity framework v 6.1.1.
我的数据库有2个表User,Location.
User table
-----------
UserID
HomeCityId(FK -> LocationId)
CurrentCityId(FK -> LocationId)
Location table
LocationId
LocationName
Run Code Online (Sandbox Code Playgroud)
使用DB First方法,我为这两个表创建了一个Entity数据模型.
生成的User表实体类
public int UserId;
public int HomeCityId;
public int CurrentCityId;
public virtual Location Location { get; set; }
public virtual Location Location1 { get; set; }
Run Code Online (Sandbox Code Playgroud)
有没有办法将这些虚拟属性命名为HomeCity和CurrentCity而不是Location和Location1?
entity-framework navigation-properties database-first ef-database-first
而不是说话让我谈谈代码:
Dim Contact = Context.Contacts.Include("Phones")
Dim phone = Contact.Phones(0)
Contact.Remove(phone)
Run Code Online (Sandbox Code Playgroud)
如何刷新上下文,取消上一次关系删除?
我试过了:
Context.Refresh(RefreshMode.StoreWins, phone) 'Doesn't recover the relation
Context.Refresh(RefreshMode.StoreWins, _
ObjectStateManager.GetObjectStateEntries(EntityState.Deleted))
Run Code Online (Sandbox Code Playgroud)
最后一个抛出InvalidOperationException:要刷新的对象集合中索引0处的元素具有空EntityKey属性值或未附加到此ObjectStateManager.
重要的 表格结构:
联系人:FirstName,LastName
电话:号码,注意
ContactPhone(多对多):ContactId(nav),PhoneId(nav)
entity-relationship many-to-many entity-framework navigation-properties
我正在使用针对SQL Server 2012数据库的DbContext POCO方法实体框架4.3.1.
我在数据库中只有两个表,它们看起来像这样:

注意:根本没有在数据库中指定外键 - 我只是在模型中强制执行关系(我无法更改数据库).
它们每个都有一行数据,如下所示:

我执行了以下查询以确保连接可以工作:

现在,我有以下实体:
public class Two
{
public long TwoId { get; set; }
public string OneId { get; set; }
public virtual One One { get; set; }
}
public class One
{
public string OneId { get; set; }
public DateTime DeliveryDate { get; set; }
public virtual ICollection<Two> Twos { get; private set; }
public void AddTwo(Two two)
{
if (two == null)
throw new ArgumentNullException("two");
if (Twos == …Run Code Online (Sandbox Code Playgroud) c# navigation-properties ef-code-first sql-server-2012 entity-framework-4.3.1
实体框架有时会生成可怕的导航属性名称.使用数据库第一种方法,解决这个问题的最佳方法是什么?
我可以根据自己的喜好编辑t4模板,但是如何将这些修改后的名称绑定到实际关系?我应该编写一个脚本来修改edmx文件吗?显然,手工制作并不是一种选择.
使用EF Core 1.1.0
我有一个模型,其集合本身就有集合.
public class A {
public string Ay {get;set;}
public List<B> Bees {get;set;}
}
public class B {
public string Be {get;set;}
public List<C> Seas {get;set;}
}
public class C {
public string See {get;set;}
public bool InDark {get;set;}
public List<D> Sigh {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
现在.. A是巨大的,99%的时间我不关心B,所以它不会被加载.如果我加载它,那将是这样的:
context.A.Include(a=>a.Bees).ThenInclude(b=>b.Seas).ThenInclude(c=>c.Sigh)...
Run Code Online (Sandbox Code Playgroud)
现在让我们说我已经加载了A并且1%恰好让我关心B.我们还没有延迟加载,但最后一个版本确实给了我们明确的加载.真棒.
context.Entry(A).Collection(a=>a.Bees).Load();
Run Code Online (Sandbox Code Playgroud)
问题似乎是没有办法在B中包含额外的集合?除了用.Include.ThenInclude.ThenInclude.Etc重新加载A,我别无选择吗?
对不起我的英语,我会尽量简洁明了.
我必须表"ALUMNOS"和"MATERIAS".在SQL中存在另一个表"ALUMNOS BY MATERIAS".我知道这在EF中不是必需的,因为存在属性导航,但是我需要获得未在任何MATERIAS中注册的ALUMNOS.
我想要这样的东西:
SELECT *
FROM ALUMNOS AS A
WHERE NOT EXISTS(
SELECT MA.MATERIAID
FROM MATERIASXALUMNO AS MA
WHERE A.LEGAJO = MA.LEGAJO
AND .MATERIAID = XXX)
Run Code Online (Sandbox Code Playgroud)
但是我的困惑开始了,因为在ALUMNOS实体中我有Mater的Collection,反之亦然,但我没有在Alumnos MateriaID或Materias AlumnosID中,所以我怎么能用linq做到这一点?
总而言之,我需要的是获得未参加XX Materia的Alumnos以及他们在该Materia注册的Alumnos ......
在此先感谢,我希望可以帮助我,我使用存储过程修复它,但我想要它与Linq或至少了解它是如何做的...
来自阿根廷的问候!吉尔