日期:2014-05-20  浏览次数:20903 次

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();
        }