EntityObject.Remove () не удаляет запись из базы данных - PullRequest
0 голосов
/ 15 февраля 2012

Я относительно новичок в Entity Framework 4.

Мой проект состоит из проекта WebApplication & ClassLibrary. Мне пришлось использовать генератор сущностей ADO.Net POCO, так как у меня есть несколько файлов edmx с некоторыми общими моделями между ними в проекте ClassLibrary.

Внутри edmx у меня есть таблицы для User, Role & UserRole (содержащие только 2 столбца внешних ключей, UserID & RoleID). Entity Framework создал две модели, а именно User и Role, со свойствами навигации Roles и Users соответственно. Я удалил definingQuery из .edmx, что позволяет мне добавлять записи в таблицу UserRole.

В моей веб-форме у меня есть этот код:
Чтобы вставить роль:

User user = new User(iUserID);  //initializes the the user object with the user info 
user.AddRole(RoleID);           //passes in the roleid that needs to be inserted`

Чтобы удалить роль пользователя:

User user = new User(iUserID);  //initializes the the user object with the user info
user.RemoveRole(RoleID);        //passes in the roleid that needs to be deleted`

Содержимое класса частичного пользователя (конструктор и 2 метода):

public User(short UserID)
{
    using (SecurityEntities Context = new SecurityEntities())
    {
        User user = Context.Users.Where(ua => ua.UserID == UserID).Single<User>();
        this.UserID = user.UserID;
        // etc...
    }
}

public void AddRole(short roleID)
{
    using (SecurityEntities Context = new SecurityEntities())
    {
        Role role = Context.Roles.Where(r => r.RoleID == roleID).Single<Role>();
        Context.AttachTo("Users", this);
        this.Roles.Add(role);
        Context.SaveChanges();
    }
}

public void RemoveRole(short roleID)
{
    using (SecurityEntities Context = new SecurityEntities())
    {
        Role role = Context.Roles.Where(r => r.RoleID == roleID).Single<Role>();
        Context.AttachTo("Users", this);
        this.Roles.Remove(role);
        Context.SaveChanges();
    }
}

Мои вопросы

  1. В методе AddRole, если я не использую AttachTo (), в таблицу User вводится повторяющаяся запись о текущем пользователе, а роль добавляется в UserRole. Почему attachTo () предотвращает это?
  2. В методе RemoveRole код работает без ошибок, но запись в таблице не удаляется. Почему?

Кто-нибудь может мне помочь?

1 Ответ

1 голос
/ 15 февраля 2012

Вы неправильно используете каркас сущностей в обоих случаях. Пользователь создается (затем отслеживается) в другом контексте. Затем вы получаете роль, используя другой экземпляр контекста.

Либо предоставьте экземпляр контекста, который создал user для метода

public void AddRole(SecurityEntities Context, short roleID)
{
        Role role = Context.Roles.Where(r => r.RoleID == roleID).Single<Role>();

        this.Roles.Add(role);
        Context.SaveChanges();
}

или предоставьте экземпляр Role методу

public void AddRole(Role role)
{
        this.Roles.Add(role);
}

Метод удаления также сталкивается с аналогичной проблемой

public void RemoveRole(short roleID)
{
     var role = this.Roles.Where(r => r.RoleID == roleID).Single();
     this.Roles.Remove(role);
}

Важным моментом является использование сущностей, принадлежащих одному экземпляру контекста. В противном случае вам придется отключиться от предыдущего контекста и присоединиться к текущему контексту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...