我知道EF 5会自动缓存查询,但是它是按照上下文还是整体来做的?我们正在使用MVC并将调用包装在using块中以处理dbcontext.例如:
public class Employee
{
public string FirstName {get; set;}
public string LastName {get; set;}
public int ID {get; set;}
}
public class EmployeeQueryByFirstName : IQueryObject<Employee>
{
private string _firstName;
public void Set(string FirstName)
{
_firstName = FirstName;
}
public Expression<Func<Employee,bool>> AsExpression()
{
return (e=>e.FirstName == this._firstName);
}
}
public class RepoExcerpt
{
public TEntity Find<TEntity>(IQueryObject<TEntity> queryObject)
where TEntity : class
{
using (var conn = ServiceLocator.IOC.Resolve<IDbContext>())
{
var query = (from q in conn.Set<TEntity>()
select q);
query = …Run Code Online (Sandbox Code Playgroud) 我试图找到一种方法从IEdmEntity到实体框架中的CLR类型.从转换到ObjectContext来获取元数据.我正在使用DataSpace.OCSpace来访问映射.我相信这是正确的,但我可能有错误的DataSpace,即使在这个博客http://blogs.msdn.com/b/alexj/archive/2009/04/之后,DataSpaces也不清楚我的脑袋里做了什么.03/tip-10-understanding-entity-framework-jargon.aspx.
最后我得到了System.Data.Entity.Core.Mapping.MappingBase对象,这些对我来说没什么用.从调试器看起来我可以访问我想要的内容,但这些类被标记为内部,我无法强制转换它们.
我是不是太难了,或者没有办法从实体框架中的IEdmModel回到它映射到的CLR类型?
添加代码以尝试使我更清楚我正在使用并尝试离开
public Type GetIEdmEntityTypeToClrType(IEdmEntityTypeReference edmEntityType, DbContext context)
{
var metadata = ((IObjectContextAdapter)context).ObjectContext.MetadataWorkspace;
var fullname = edmEntityType.EntityDefinition().FullName();
EntityType entityType;
if (metadata.TryGetItem(fullname, DataSpace.CSSpace, out entityType))
{
//doesn't hit
}
if (metadata.TryGetItem(fullname, DataSpace.CSpace, out entityType))
{
//hits but can't get access to CLR Type that it's mapped too.
}
if (metadata.TryGetItem(fullname, DataSpace.OCSpace, out entityType))
{
//doesn't hit
}
if (metadata.TryGetItem(fullname, DataSpace.OSpace, out entityType))
{
//doesn't hit
}
if (metadata.TryGetItem(fullname, DataSpace.SSpace, out entityType))
{
//doesn't hit
} …Run Code Online (Sandbox Code Playgroud) 我们正在将我们的应用程序迁移到.NET.其中一个主要目标是允许每个客户端修改应用程序,但不允许修改源代码.我们通过编程到接口并使用依赖性解析器(具有覆盖基本注册的选项)和MEF在核心框架中解决了这个问题.
现在,当涉及到视图(客户端看到的UI)时,模板看起来是静态的,如果客户端想要在屏幕上添加新字段,那么他们似乎需要修改视图本身.
我能想到的唯一两件事就是修改viewengine的搜索路径.这将允许获取基础的副本并对其进行更改.不是很喜欢这个,因为它是代码的副本.
另一方面,我们现在正在做的是,我们创建一个类,它是输出HTML的其他对象的容器.基本上我们有一个PageObject,LabelObject,InputObject..ect,我们可以调用它们并输出HTML.由于它们是类,我们可以使用与给出切片的其余应用相同的方法.走这条路线我们真的没有使用viewengine进行渲染,只是用于组合所有部分视图.看起来有点笨重.
有没有不同的方法来实现这个目标或不同的视图引擎,我可以用来实现允许客户定制而不触及基本视图的目标?我知道HTML不是一个对象,但在处理HTML和允许自定义时,ASP.NET WebForms和ASP.NET MVC之间似乎必然存在一些东西.
我正在修改库以添加异步方法.From 我应该为异步方法公开同步包装器吗?它说我不应该只是Task.Result在调用同步方法时写一个包装器.但是,我如何在异步方法和同步方法之间复制大量代码,因为我们希望在库中保留两个选项?
例如,库当前使用TextReader.Read方法.我们想要使用TextReader.ReadAsync方法的部分异步更改.由于这是库的核心,我似乎需要在同步和异步方法之间复制大量代码(希望尽可能保持代码DRY).或者,我需要重构出来的PreRead,并PostRead似乎杂乱的代码,什么TPL试图修复方法.
我正在考虑将TextReader.Read方法包装在一个Task.Return().即使它是一项任务,TPL的改进也不应该让它切换到不同的线程,我仍然可以使用异步等待大多数代码,就像正常一样.难道然后是确定有同步的包装是公正Task.Result还是Wait()?
我查看了.net库中的其他示例.在StreamReader似乎复制异步与非异步之间的代码.在MemoryStream做了Task.FromResult.
还计划到处都可以添加,ConfigureAwait(false)因为它只是一个库.
更新:
我所说的重复代码是
public decimal ReadDecimal()
{
do
{
if (!Read())
{
SetInternalProperies()
}
else
{
return _reader.AsDecimal();
}
} while (_reader.hasValue)
}
public async Task<decimal> ReadDecimalAsync()
{
do
{
if (!await ReadAsync())
{
SetInternalProperies()
}
else
{
return _reader.AsDecimal();
}
} while (_reader.hasValue)
}
Run Code Online (Sandbox Code Playgroud)
这是一个小例子,但您可以看到唯一的代码更改是等待和任务.
为了说清楚,我想在库中的所有地方使用async/await和TPL进行编码,但我仍然需要使用旧的同步方法.我不仅仅是Task.FromResult() …