Linq To Sql, почему я получаю дубликаты записей? - PullRequest
0 голосов
/ 23 апреля 2010

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

using (UserRepository repository = new UserRepository())
{
    var user = new user
    {
        user_created = DateTime.Now,
        user_email = email,
        user_password = GetHashedPassword(password)                            
    };

    // create an entry in the users history
    user.user_histories.Add(new user_history
    {
        user_history_date = DateTime.Now,
        action = GetUserAction("Registered")
    });                          

    // commit the new user to the database
    repository.InsertUser(user);
    repository.Save(); 
}

public static action GetUserAction(string userAction)
{
    action a = null;

    using (UserRepository repository = new UserRepository())
    {
        a = repository.SelectUserAction(userAction);

        // in the SO example I know a is not null so ignore the next 8 lines
        if (a == null)
        {
            a = new action
            {
                action_name = userAction
            };                    
        }
   }

   return a;
}

1 Ответ

0 голосов
/ 23 апреля 2010

Из вашего кода я могу сделать вывод, что user_history и action связаны отношением внешнего ключа.

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

Редактировать : если первичный ключ вашего действия - это автоматически генерируемый столбец идентификаторов, вы можете проверить, является ли он новым, сравнив его с нулем.Для новых объектов их идентификаторы установлены в ноль.

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

...