- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我目前正在开发一个 EF Fluent 项目(是的,我确实喜欢这样写),该项目采用模型优先方法,在 EF 4.3 上采用 Table-Per-Type 架构。
正如我在过去几个月中发现的那样,Table-Per-Type 和继承并没有很好地发挥作用 -> more information .我正在使用具有七个派生类的单个基类,并且仅在七个派生类中返回项目并不是特别快。就执行时间而言,要检索包含 5 条记录的列表,EF 需要 5 到 7 秒,后续执行大约需要 2.5 到 4 秒。可以肯定地说这是 Not Acceptable ,所以我正在寻找替代方法...
我能做的是多次访问数据库,即尝试单独检索每种类型的对象并整理成一个集合;然而,代码充其量是笨拙的,即
IList<MyBaseClass> items = new List<MyBaseClass>();
dbContext.Database.SqlQuery<MyFirstDerivedClass>("SELECT * FROM MyBaseClass INNER JOIN MyFirstDerivedClass ON...").ToList().ForEach(x => items.Add(x));
... repeat for each derived class...
return items;
但它有效!第一次访问数据库需要 2 秒,后续查询只需 200 毫秒。
我的问题是这不是很优雅、可维护等。我一直在尝试将 dbContext 转换为 ObjectContext 并使用类似这样的存储过程('spGetMyDerivedItems')返回所有派生结果集在一次数据库命中中排序...
IList<MyBaseClass> items = new List<MyBaseClass>();
ObjectContext oContext = ((IObjectContextAdapter)dbContext).ObjectContext;
using (var connection = oContext.Connection as EntityConnection)
{
EntityCommand command = connection.CreateCommand();
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "spGetMyDerivedItems";
connection.Open();
using (EntityDataReader reader = command.ExecuteReader())
{
oContext.Translate<MyFirstDerivedClass>(reader).ToList().ForEach( x => items.Add(x));
reader.NextResult();
...repeat for each derived type...
}
}
return items;
但是,这不适用于提示 CommandText 无效并且我必须提供“ContainerName”的 InvalidOperationException。我在这里的猜测是,如果我使用的是 EDMX 文件,我可以设置这个设置项(并且使用 DefaultContainerName 不起作用)。但我正在采取流利的方法,我觉得我已经走到了死胡同。
所以...
有哪些方法可以解决 EF 和 table-per-type 的性能问题?是否可以使用 Fluent/Model First 方法通过 ObjectContext 执行存储过程?我可以执行标准 SQLClient.SqlDataReader 并转换为 ObjectContext 吗?
提前致谢...
最佳答案
好的 - 似乎 ObjectContext 可以从 System.Data.SqlClient.SqlDataReader 转换,这意味着我不需要(直接)从 dbContext 派生。这是示例代码...
IList<MyBaseClass> items = new List<MyBaseClass>();
ObjectContext oContext = ((IObjectContextAdapter)dbContext).ObjectContext;
using (var sqlConn = new SqlConnection(dbContext.Database.Connection.ConnectionString))
{
SqlCommand sqlComm = new SqlCommand(){
Connection = sqlConn,
CommandText = "spGetMyDerivedItems",
CommandType = CommandType.StoredProcedure
};
sqlConn.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
oContext.Translate<MyFirstDerivedClass>(reader).ToList().ForEach( x => items.Add(x));
reader.NextResult();
...repeat for each derived type...
}
}
return items;
显然,最好的答案是 EF 会选择它,但我目前对上面的内容很满意。迁移到 EF5 听起来是个不错的举措 - 但随着时间的推移,它会更好 :)
感谢您的帮助。
关于c# - Entity Framework Fluent、Table-Per-Type 性能替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14758436/
这是我的 Fluent 模型 struct Ailment: PostgreSQLModel { enum Frequency: String , Content { case regular
我正在尝试使用 Fluent Nhibernate 自动映射一个简单的继承层次结构,并且我需要为每个表使用与其类稍有不同的名称(下划线而不是 Pascal 大小写)。这似乎是一个使用约定的明显地方。我
如何为没有标识列的表指定流畅的 NHibernate 映射? 我想要这样的东西: public sealed class CustomerNewMap : ClassMap, IMap { p
使用 FluentMigrator,有没有办法找出 MigrateUp() 函数是否确实会迁移某些东西,或者它是否已经是最新的? 最佳答案 没有简单的方法可以使用公共(public) api 判断 M
我正在使用 Fluent NHibernate,我喜欢它! 我有一个小问题:启动时间大约是 10 秒,我不知道如何优化 Fluent nHibernate 为了减少这个启动时间的问题,我把它放在一个线
我在 Fluent NHIbernate 中使用 AutoPersistenceModel 来映射我的所有实体,并且一切正常:D 但是,我的几个对象有 public virtual IList Com
我有一个数据库,我正在运行多个应用程序。我喜欢通过为每个应用程序创建模式来分隔表。对于我最新的应用程序,我使用的是 FluentNHibernate。似乎我的大部分管道都是正确的,但是当我尝试查询其中
应用程序有许多扩展程序集,它们包含其类的映射。我需要为这些映射中的所有(基本、连接、多对多等)表名添加前缀。 例如 Assembly: ~/bin/Extensions/Foo.dll
您好,我很好奇 DDD 是如何使用 Fluent Nhibernate 真正实现的。例如,我有一个名为 User 的实体类和另一个名为 UserProfile 的类,就我而言,UserProfile
是否可以在 Fluent NHibernate 中映射来自多个程序集的实体? 我试过了 AutoPersistenceModel .MapEntitiesFromAssemblyOf() .AddEn
我有一个看起来像这样的基类: public abstract class MyBaseClass { public virtual DateTime UpdatedOn { get; set;
我有 Post 和 Comment 类,它们有一对多的关系,其中 Post 有一个评论列表。我如何将其映射为与 Fluent NHibernate 的单向关系,因为评论不需要知道其父 Post?目前,
我对如何查询模型对象的子对象并立即使用它感到困惑。我的Client包含数量Station child final class Client: PostgreSQLModel { var sta
目前我有一个表“ComponentAnalysis”和一个表“HistoryOfUse”,我正试图在 Fluent NHibernate 中进行映射。 一个成分分析应该只有1个使用历史,一个使用历史应
正如标题所说,我想知道我是否应该避免将 fluent nhibernate 用于生产代码,或者它是否足够成熟,可以“深入研究”? :) 最佳答案 FluentNHibernate API 尚未稳定下来
我正在尝试使用 Fluent NHibernate,我有几个问题。我发现缺少文档。 我知道 Fluent NHibernate/NHibernate 允许您自动生成数据库模式。人们通常只对测试/开发数
我正在使用 fluent-nhibernate 约定来映射我的实体: public class HasManyConvention : IHasManyConvention {
如何更改多列索引中的列顺序? IE: mapping.References(x => x.SomeReference).SetAttribute("index", "IX_index"); mappi
我需要像下面的代码一样创建一个外键: Create.ForeignKey().FromTable("TCGDocFiscalOpMedItem").ForeignColumn("IDCabecalho
我正在使用 Sharp 架构,并且在许多情况下都在实体中使用了值对象。这是一个明显的简单示例: public class Person : Entity { protected Person(
我是一名优秀的程序员,十分优秀!