这主要适用于不通过soa访问数据的asp.net应用程序.这意味着您可以访问从框架加载的对象,而不是转移对象,尽管某些建议仍然适用.
这是一个社区帖子,所以请在您认为合适时添加.
适用于:Visual Studio 2008 sp1附带的Entity Framework 1.0.
为什么首先选择EF?
考虑到这是一项存在大量问题的年轻技术(见下文),为您的项目加入EF可能很难.然而,这是微软正在推动的技术(以牺牲Linq2Sql为代价,它是EF的一个子集).此外,您可能对NHibernate或其他解决方案不满意.无论是什么原因,都有人(包括我)与EF合作,生活也不错.你想.
EF和继承
第一个重要的主题是继承.EF确实支持以两种方式持久化的继承类的映射:每个类的表和表的层次结构.建模很简单,该部分没有编程问题.
(以下适用于每个类模型的表,因为我没有每个层次结构的表的经验,无论如何,这是有限的.)当您尝试运行包含一个或多个对象的查询时,真正的问题就出现了.继承树:生成的sql非常糟糕,需要很长时间才能被EF解析并且需要很长时间才能执行.这是一个真正的表演塞子.足够的EF应该不能用于继承或尽可能少.
这是一个多么糟糕的例子.我的EF模型有~30个类,其中约10个是继承树的一部分.在运行查询以从Base类获取一个项目时,就像Base.Get(id)一样简单,生成的SQL超过50,000个字符.然后,当您尝试返回一些关联时,它会退化甚至更多,就抛出SQL异常而言,无法一次查询超过256个表.
好的,这很糟糕,EF概念允许您在没有(或尽可能少)考虑表的实际数据库实现的情况下创建对象结构.它完全失败了.
那么,推荐?如果可以的话,避免继承,性能会好得多.在必要的地方谨慎使用它.在我看来,这使得EF成为用于查询的美化sql生成工具,但使用它仍然有优势.以及实现类似于继承的机制的方法.
使用接口绕过继承
尝试使用EF进行某种继承时,首先要知道的是,您不能将非EF建模类指定为基类.甚至不尝试它,它将被建模者覆盖.那么该怎么办?
您可以使用接口来强制该类实现某些功能.例如,这里有一个IEntity接口,允许您定义EF实体之间的关联,您在设计时不知道实体的类型.
public enum EntityTypes{ Unknown = -1, Dog = 0, Cat }
public interface IEntity
{
int EntityID { get; }
string Name { get; }
Type EntityType { get; }
}
public partial class Dog : IEntity
{
// implement EntityID and Name which could actually be fields
// from your EF model
Type EntityType{ get{ return EntityTypes.Dog; } } …
Run Code Online (Sandbox Code Playgroud) 我是Mercurial的新手,在我的项目中清理了图像文件夹后,我有大量的文件显示!在'hg status'中.我可以为每个人键入'hg forget',但必须有一个更简单的方法.
那么我怎么能告诉mercurial忘记文件夹中所有被删除的(status =!)文件?
我有一个工作正常的应用程序,除非它在后台很长一段时间并被带回到前台.我想知道这是否与标志alwaysRetainTaskState有关,当系统清除我的活动堆栈时.我想测试它,但我不想每次都坐30分钟.有没有办法以其他方式触发正常的系统行为?
更新:如果我设置标志android:clearTaskOnLaunch,当我重新启动应用程序时,是否会执行与alwaysRetainTaskState相同的操作?
我在RENDERMODE_WHEN_DIRTY中使用GLSurfaceView(sdk版本7).文档说我需要调用onPause/onResume,但没有它就可以正常工作,所以我很想知道.需要吗?如果我不这样做会怎么样?
我想知道以下排序算法的复杂性(如在O(...)中):
排序将单个排序列表中每个桶的所有元素组合在一起:
或者在伪代码中:
for i from 0 to N
smallest = MAX_ELEMENT
foreach b in B
if bIndex[b] < b.length && b[bIndex[b]] < smallest
smallest_barrel = b
smallest = b[bIndex[b]]
result[i] = smallest
bIndex[smallest_barrel] += 1
Run Code Online (Sandbox Code Playgroud)
我认为复杂性将是O(n),但我发现复杂性的问题是,如果B增长,它比N增长具有更大的影响,因为它在B循环中添加了另一轮.但也许这对复杂性没有影响?
对于在经常被调用的函数中使用的变量以及在黑莓上的J2ME中实现的变量(如果改变了某些东西,你能解释一下)吗?
class X {
int i;
public void someFunc(int j) {
i = 0;
while( i < j ){
[...]
i++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
要么
class X {
static int i;
public void someFunc(int j) {
i = 0;
while( i < j ){
[...]
i++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
要么
class X {
public void someFunc(int j) {
int i = 0;
while( i < j ){
[...]
i++;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道如何访问静态类和非静态类变量,但我不知道它会影响速度.我还记得在某处读取函数变量可以更快地访问,但我不知道为什么以及在哪里读到它.
问题的背景:游戏中的一些绘画功能被过度调用,即使在较大的循环中使用变量时访问时间的微小差异也会影响整体性能.
更新
我设置了一个小测试(下面的代码)并在真实设备上运行它以查看结果是什么样的.我对一个循环10000次访问变量的函数运行了10000次调用.
我在我的一个游戏中实现了一些应用内购买.整个过程通常运作良好,少数人已成功购买物品.
但是,查看游戏的在线日志,handleActivityResult(int requestCode, int resultCode, Intent data)
函数中会出现一堆错误,因为它Intent data
是null.
那么,在哪种情况下,意图数据可以为空?Google的文档没有详细说明.