标签: navigation-properties

.Skip().实体框架上的Take()导航属性正在我的SQL Server上执行SELECT*

我在生成的部分类上有一个方法,如下所示:

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

8
推荐指数
1
解决办法
9251
查看次数

如何在Entity Framework中更新实体的导航属性

在带有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

8
推荐指数
1
解决办法
5278
查看次数

实体框架 - 包含/参考/集合

我想知道为什么有单独的方法来填充导航属性.

如果我在整套工作,我可以打电话Include给财产或集合.

但是,如果我处理单个实体,则根据项目是collection(Collection)还是单引用(Reference),有两种不同的方法可以调用.

有没有办法解决这个问题 - 这使得事情变得比我想象的更复杂.谁能解释为什么在设计EF时决定了这一点?

编辑

进一步研究,问题更深入.我试图做的是创建一种在单个实体上加载集合/导航属性的通用方法.使用Include可以在整个集合上轻松完成.但该方法的签名ReferenceCollection略有不同.

没关系,将不得不在我的应用程序周围分散这些调用.

例如

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)

c# entity-framework navigation-properties

8
推荐指数
2
解决办法
1万
查看次数

在Entity Framework中设置仅具有id的导航属性的最佳方法是什么?

我有下一个想法:

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

8
推荐指数
1
解决办法
4164
查看次数

Entity Framework DB First - 命名导航属性

我在我的应用程序中使用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

8
推荐指数
1
解决办法
707
查看次数

取消删除标记为EntityState.Delete的实体?

而不是说话让我谈谈代码:

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

7
推荐指数
1
解决办法
5203
查看次数

为什么日期时间会阻止导航属性加载?

我正在使用针对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

7
推荐指数
1
解决办法
131
查看次数

重命名导航属性

实体框架有时会生成可怕的导航属性名称.使用数据库第一种方法,解决这个问题的最佳方法是什么?

我可以根据自己的喜好编辑t4模板,但是如何将这些修改后的名称绑定到实际关系?我应该编写一个脚本来修改edmx文件吗?显然,手工制作并不是一种选择.

navigation-properties ef-database-first entity-framework-5

7
推荐指数
1
解决办法
3515
查看次数

EF Core Collection Load .. of Collection

使用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,我别无选择吗?

c# navigation-properties entity-framework-core

7
推荐指数
1
解决办法
2087
查看次数

不存在使用Linq

对不起我的英语,我会尽量简洁明了.

我必须表"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或至少了解它是如何做的...

来自阿根廷的问候!吉尔

c# linq entity-framework not-exists navigation-properties

6
推荐指数
2
解决办法
2万
查看次数