我的代码中有一个特定的查询,需要急切加载所有相关的实体(两个 - > 1个FK和 - > N个FK),因为上下文将在此之后处理.
我做了一个通用的"查询"方法,params Expression<Func<MyItem, object>>[] includes然后内部链接它们.那部分工作正常.
查询如下所示:
var item = facade.Query<MyItem>(
c => c.Childs.Select(x => x.Parent),
c => c.Childs.Select(x => x.SubChild1),
c => c.Childs.Select(x => x.SubChildNotWorking),
c => c.Childs.Select(x => x.SubChild2),
c => c.Childs.Select(x => x.SubChild3),
c => c.Childs.Select(x => x.SubChildrens)
).FirstOrDefault(c => c.Name == name);
Run Code Online (Sandbox Code Playgroud)
不工作属性的映射(放置在SubChildNotWorking的配置中):
this.HasMany(scnw => scnw.Childs).WithOptional(c => c.SubChildNotWorking).HasForeignKey(c => c.MyForeignKey);
Run Code Online (Sandbox Code Playgroud)
在所有包含中,只有SubChildNotWorking实际上不起作用.在使用调试器检查返回的对象时,我会在所有属性上看到代理.打开代理为我提供了所有其他关系的正确数据,并为该SubChildNotWorking属性提供了"objectcontext已被处置异常" .
我能够发现的唯一区别是,它SubChildNotWorking是一个可以为空的FK(DB上有可空列和dbcontext中的WithOptional配置),而所有其他都是使用WithRequired配置的不可空FK.
数据库也是一个没有使用Code First创建的遗留数据库而不遵循其约定,我只是在DbContext中进行了映射.其他一切都很好.
我试图找出是否急于加载对可空的FK不起作用,但我找不到任何关于它的文档.
这是一个错误,还是预期的行为?但最重要的是,我该如何解决这个问题呢?
谢谢.
在Grails/GORM中,static mapping = {xyz lazy: false}&之间有什么区别static fetchMode = [xyz: 'eager']?
例:
class Book {
static belongsTo = [author: Author]
static mapping = {author lazy: false}
static fetchMode = [author: 'eager']
}
Run Code Online (Sandbox Code Playgroud) 艺术家有很多活动(基本上是用户之间的互动缓存):
class Activity < ActiveRecord::Base
belongs_to :receiver, :class_name => 'Artist', :foreign_key => :receiver_id #owns the stuff done "TO" him
belongs_to :link, :polymorphic => true
belongs_to :creator, :class_name => 'Artist', :foreign_key => :creator_id #person who initiated the activity
end
Run Code Online (Sandbox Code Playgroud)
例如:
Activity.create(:receiver_id => author_id, :creator_id => artist_id, :link_id => id, :link_type => 'ArtRating')
Run Code Online (Sandbox Code Playgroud)
我想为每位艺术家创建一个活动流页面,包括不同类型的活动列表,ArtRatings(喜欢,不喜欢),收藏,关注等.
控制器看起来像这样:
class ActivityStreamController < ApplicationController
def index
@activities = @artist.activities.includes([:link,:creator,:receiver]).order("id DESC").limit(30)
end
end
Run Code Online (Sandbox Code Playgroud)
db调用正确地急切地加载多态链接对象:
SELECT "activities".* FROM "activities" WHERE (("activities"."receiver_id" = 6 OR "activities"."creator_id" = 6)) ORDER BY …Run Code Online (Sandbox Code Playgroud) 在EF 4,我可以通过编写SQL做导航性能的渴望装载DbContext.Database.SqlQuery或DbContext.Set<T>().SqlQuery?我似乎没有填充我的导航属性.
编辑
看来我可以使用DbContext.Set()进行eagerloading.SqlQuery,而不是DbContext.Database.SqlQuery.知道为什么吗?
以下是Oracle确认的错误报告:http://bugs.mysql.com/bug.php?id = 67183
情况
当.Include我在我的存储库中使用链时,我注意到我得到了奇怪的结果 - 主要是被查询的值是从错误的字段返回的(例如,名称最终会出现在描述中 - 但在数据库中所有的值都是正确,他们只在查询后显示错误).我更改了名称,因此关系更加明显,但结构是一样的.我一直在为相关的CrewMember及其相对排名和清除得到错误的值.看起来如果CrewMember中的字段名称与Rank相同,则Rank中该字段的值将变为CrewMember中的值.例如,如果Rank有描述,CrewMember也是如此,那么CrewMember的Rank描述将是CrewMember的描述.
当由于MySQL Connector/NET sql提供程序无法正确形成join语句而导致类似字段定义时,实体框架无法在2的深度进行格式良好的查询.
定义
这是一个为数据库表建模的类定义.我正在使用C#ASP.NET MVC 3与Entity Framework 4.1和MySQL Connector/NET 6.5版
public class Harbor
{
public int HarborId { get; set; }
public virtual ICollection<Ship> Ships { get; set; }
public string Description { get; set; }
}
public class Ship
{
public int ShipId { get; set; }
public int HarborId { get; set; }
public virtual Harbor Harbor { get; set; } …Run Code Online (Sandbox Code Playgroud) 希望标题有意义,我会尽力描述我的问题.
我目前正在开发ASP.NET Web API.在我的"公司"控制器中,我有一个GetCompany()动作.
/// <summary>
/// Gets the 'Authorization-Token' request header and finds the company with the
/// matching decrypted token from the database, returns it; if null, returns 404
/// </summary>
/// <returns>Matching company for token passed in request or 404 if null</returns>
[HttpGet][ResponseType(typeof(Company))]
[Route("api/company/")]
public HttpResponseMessage GetCompany() {
string token = Request.Headers.GetValues("Authorization-Token").First();
ICollection<Company> companies;
Company c;
using (BaseRepository r = new BaseRepository()) {
companies = r.Get<Company>(null, null, null);
c = companies.Where(cm => RSA.Decrypt(cm.Token) == token).FirstOrDefault<Company>();
}
if …Run Code Online (Sandbox Code Playgroud) 我有这样的结构:
class User(DeclarativeBase):
...
teamMemberships = orm.relationship("TeamXREF",backref="user",lazy = "dynamic")
class TeamXREF(DeclarativeBase):
...
class Team(DeclarativeBase):
...
name=db.Column(String)
teamMembers = orm.relationship("TeamXREF",backref="team",lazy = "dynamic")
Run Code Online (Sandbox Code Playgroud)
但是,我无法设法写入 1 个查询(我总是以循环和多个查询结束)来立即加载所有这些信息:
众所周知,建议使用注释javax.enterprise.context而不是javax.faces.bean它们被弃用.
我们都发现eager="true"带有@ApplicationScoped from javax.faces.bean和带有@PostConstruct方法的ManagedBeans 对于Web应用程序初始化非常有用,例如:从文件系统读取属性,初始化数据库连接等等...
示例:
import javax.faces.bean.ApplicationScoped;
import javax.faces.bean.ManagedBean;
import javax.annotation.PostConstruct;
@ApplicationScoped
@ManagedBean(eager=true)
public class someBean{
@PostConstruct
public void init(){
//Do all needed application initialization.
}
...
}
Run Code Online (Sandbox Code Playgroud)
我想知道的是,如果我使用注释,我怎么能得到相同的行为javax.enterprise.context.
注意:
@Startup注释fromjavax.ejb将有助于运行该代码,但仅在应用程序服务器启动时部署webapp时.
我尝试通过这两种方式禁用延迟加载:
1)
public SqlDbContext(DbContextOptions<SqlDbContext> options) : base(options)
{
this.ChangeTracker.LazyLoadingEnabled = false;
}
Run Code Online (Sandbox Code Playgroud)
2)
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<SqlDbContext>(options => {
options.UseSqlServer(Configuration.GetConnectionString("SqlDbContext"));
options.UseLazyLoadingProxies(false);
});
Run Code Online (Sandbox Code Playgroud)
我在导航中没有使用关键字“虚拟”。
不幸的是,延迟加载仍然有效。我想禁用它,强制我只使用急切加载,因此当我忘记使用 Include() 时会抛出错误。
但是通过这两种方法,查询仍然返回结果。
我有2个相关的Linq to SQL问题.请参阅下面的图片,看看我的模型是什么样的.
问题1
我想知道如何User.AddedByUser在我的User 类/表上加载字段.该字段由字段上的关系生成User.AddedByUserId.该表是自引用的,我试图弄清楚如何让Linq to SQL User.AddedByUser急切地加载属性,即无论何时User加载/获取任何实体,它还必须获取User.AddedByUser和User.ChangedByUser.但是,据我所知,这可能会成为一个递归问题......
更新1.1:
我试过使用DataLoadOptions如下:
var options = new DataLoadOptions();
options.LoadWith<User>(u => u.ChangedByUser);
options.LoadWith<User>(u => u.AddedByUser);
db = new ModelDataContext(connectionString);
db.LoadOptions = options;
Run Code Online (Sandbox Code Playgroud)
但这不起作用,我在第2行得到以下异常:
System.InvalidOperationException occurred
Message="Cycles not allowed in LoadOptions LoadWith type graph."
Source="System.Data.Linq"
StackTrace:
at System.Data.Linq.DataLoadOptions.ValidateTypeGraphAcyclic()
at System.Data.Linq.DataLoadOptions.Preload(MemberInfo association)
at System.Data.Linq.DataLoadOptions.LoadWith[T](Expression`1 expression)
at i3t.KpCosting.Service.Library.Repositories.UserRepository..ctor(String connectionString) in C:\Development\KP Costing\Trunk\Code\i3t.KpCosting.Service.Library\Repositories\UserRepository.cs:line 15
InnerException:
Run Code Online (Sandbox Code Playgroud)
异常是不言自明的 - 对象图不允许是循环的.另外,假设第2行没有抛出异常,我很确定第3行会,因为它们是重复键.
更新1.2:
以下内容也不起作用(不与上面的Update 1.1结合使用):
var query = from u …Run Code Online (Sandbox Code Playgroud) eager-loading ×10
c# ×5
lazy-loading ×3
cdi ×1
code-first ×1
fetch ×1
grails ×1
grails-orm ×1
java-ee ×1
jsf ×1
json ×1
linq ×1
linq-to-sql ×1
managed-bean ×1
mysql ×1
python ×1
sqlalchemy ×1
t-sql ×1