首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET Framework >

Entity Framework 两问,该如何处理

2012-12-14 
Entity Framework 两问1、在根据数据库更新 edmx 时,出现错误The model was generated with warnings or er

Entity Framework 两问
1、在根据数据库更新 edmx 时,出现错误

The model was generated with warnings or errors.
Please see the Error List for more details. These issues must be fixed before running your application.
Loading metadata from the database took 00:00:03.5636247.
Generating the model took 00:00:15.7680284.

但是错误不知道在哪里可以看到

2、对数据库的数据进行 update 的问题
如果实体对象是从一个 ObjectContext 对象读取,则无法将它 attach 到另一个 ObjectContext 对象中,下面的 attach 语句将出现错误

DataSourceDBEntities db1 = new DataSourceDBEntities();
var q1 =
from f in db1.Foods
select f;

Food food = q1.FirstOrDefault<Food>();

DataSourceDBEntities db2 = new DataSourceDBEntities();

// food = new Food();
// food.Id = 1;
food.AddDate = DateTime.Now;
if (food.NAME == "Orange")
food.NAME = "Apple";
else
food.NAME = "Orange";

db2.Foods.Attach(food);
db2.SaveChanges();

[最优解释]
第一个问题,看楼上

第二个问题,是EF无法重复附加已经在状态管理的控制的实体。所以如果你想附加,就必须在第一次的时候申明让EF不在维护状态。


DataSourceDBEntities db1 = new DataSourceDBEntities();
var q1 =
    from f in db1.Foods
    select f;           
Food food = q1.FirstOrDefault<Food>();
 db1.Detach(food); //移除状态管理

而第二次附加时候,必须显示更改一下状态
db2.Foods.Attach(food);
 db2.ObjectStateManager.ChangeObjectState(food, System.Data.EntityState.Modified);//显示修改管理状态,后面那个枚举你看情况使用


[其他解释]
1. VS中有个窗口就叫Error List. 没有的话,通过菜单View -> error list打开。
[其他解释]
2. 我觉得应该用构造一个新的Food对象,用Add加到另一个Context中?
这里有Attach和Add的区别的讨论,你可以看一下:
http://stackoverflow.com/questions/3920111/entity-framework-4-addobject-vs-attach
[其他解释]
关于第一个问题,在确认你的数据库没问题的情况下,在你的edmx设计中把所有的Entity删除,然后再更新一次。
删除不能用delete,必须用shift + delete真正地删除。
[其他解释]
千万别使用啥单件模式,别的地方可以单件,这里千万别单键

和数据库打交道及时释放连接池才是要考虑的事情,公用一个ET实例,多并发的话,连接池一会就满了,那个著名的“黄页”又要出来了
[其他解释]
ORM千万不要用单例模式,因为ORM在Save的时候是把一级缓存里的所有数据Commit,你用单例就意味着极可能把不该提交的数据数据也提交了。
[其他解释]
第一个问题,很是奇怪

[其他解释]
对于第二个问题,如果我在系统中使用了“静态单例模式”,是不是不用考虑那么多了:
public partial class DataSourceDBEntities {
    [ThreadStatic]
    private static DataSourceDBEntities instance;
    public static DataSourceDBEntities CurrentInstance {
        if(instance == null){
            instance = new DataSourceDBEntities();
        }


        return instance;
    }
}

使用时不再使用 new,而是调用静态方法得到当前线程的唯一实例:
DataSourceDBEntities db = DataSourceDBEntities.CurrentInstance;


[其他解释]

引用:
千万别使用啥单件模式,别的地方可以单件,这里千万别单键

和数据库打交道及时释放连接池才是要考虑的事情,公用一个ET实例,多并发的话,连接池一会就满了,那个著名的“黄页”又要出来了


但是在 EF 框架下,连接都是打开然后马上自动关闭的,并且访问数据库的前后都不需要主动打开和关闭操作,也没有将之放在 using(DataSourceDBEntities db = new DataSourceDBEntities ()){ } 而默认调用它的 Dispose 方法。
经过调试检查,发现 DataSourceDBEntities.Connection.State 值,访问数据库之前和之后,都是关闭状态。因此我判断 EF 会在每次访问数据库之前检查连接状态,并且在连接完成之后再关闭连接。


另外,我强调一下,我这里说的是“静态的单态模式”,注意前面的 [ThreadStatic] 属性
[ThreadStatic]
private static DataSourceDBEntities instance;
它使同一个线程得到的实例是相同的,不同线程得到不同的实例。当然,在 global.asax 的 Application_EndRequest 事件中,要把这个值修改为 null
[其他解释]
引用:
ORM千万不要用单例模式,因为ORM在Save的时候是把一级缓存里的所有数据Commit,你用单例就意味着极可能把不该提交的数据数据也提交了。


我说了,我用的是线程的单例,不是整个应用的单例

热点排行