开发者

EF4 - Force order of execution

开发者 https://www.devze.com 2023-03-18 03:03 出处:网络
I have three tables - Context, Session and User. And below are their simplified structure. User: UserId (Int, PK)

I have three tables - Context, Session and User. And below are their simplified structure.

User:

UserId (Int, PK)

Email (Varchar(100))

Context:

ContextId (Int, PK)

UserId (Int, FK from User table)

CurrentSessionId (Int, Nullable, FK from Session table)

Session:

SessionId (Int, PK)

UserId (Int, FK from User table)

ContextId (Int, FK from Context table)

Below is the sequence in my code to delete a user entity.

1) Update CurrentSessionId of Context table to null where UserId = UserId to be deleted.

2) Delete all Sessions corresponding to the User

3) Delete all Contexts corresponding to the User

4) Finally Delete User.

5) Call ObjectContext.SaveChanges()

Upon calling ObjectContext.SaveChanges() I get the following exception -

Unable to determine a valid ordering for dependent operations. Dependencies may exist due to foreign key constraints, model requirements, or store-generated values.

I guess EF4 gets confused determining the execution开发者_如何学编程 order of first 3 statements. Is it possible to tell EF4 what statements to execute first and what to execute next?

One way I can work around is to call SaveChanges() after step one and then call it again after step four. But I would love to know if there are any other elegant solution than that.


Based on this MSDN link the order of execution cannot be forced in EF4. I had to call SaveChanges() twice once after step one and then again after step four.


I think the issue lies with the circular reference between Session and Context; if you get rid of Context.CurrentSessionId then your generated Context object will still have a Sessions property you can use, but EF shouldn't get upset trying to negotiate the dependencies. You could manually add a CurrentSession property to Context like this:

public Session CurrentSession
{
    get { return this.Sessions.FirstOrDefault(); }
}

Also, if you set the User -> Context and User -> Session relationships in your EF model to cascade delete (or even better in the database), then deleting a User becomes just two lines:

objectContext.Users.DeleteObject(user);
objectContext.SaveChanges();
0

精彩评论

暂无评论...
验证码 换一张
取 消