При создании User
мне нужно дать ему систему Role
, поэтому мне было интересно, что это лучший способ сделать это.Вставка с использованием идентификатора области действия в качестве атрибута
У меня есть рабочее решение, но я не уверен, что это лучший способ.
using (SqlConnection con = new SqlConnection(conString))
{
con.Open();
using (SqlCommand cmd = new SqlCommand(@"INSERT INTO Users (Name, Email, Username, Password, Active) VALUES (@Name, @Email, @Username, @Password, @Active); SELECT SCOPE_IDENTITY();", con))
{
try
{
cmd.Parameters.AddWithValue("@Name", user._Name);
cmd.Parameters.AddWithValue("@Email", user._Email);
cmd.Parameters.AddWithValue("@Username", user._Email);
cmd.Parameters.AddWithValue("@Password", user.Password);
cmd.Parameters.AddWithValue("@Active", 1);
user_id = Convert.ToInt32(cmd.ExecuteScalar());
//cmd.ExecuteNonQuery();
}
catch (SqlException)
{
//Handle Exception
}
}
}
using (SqlConnection con = new SqlConnection(conString))
{
using (SqlCommand cmd = new SqlCommand("INSERT INTO User_Role (User_Role_User_Id, User_Role_Role_Id) VALUES (@User_ID, @Role_ID)", con))
{
try
{
cmd.Parameters.AddWithValue("@User_ID", user_id);
cmd.Parameters.AddWithValue("@Role_ID", user.Role_ID);
cmd.ExecuteNonQuery();
}
catch (SqlException)
{
//Handle Exception
}
}
}
Теперь моя проблема в том, что если по какой-либо причине добавление роли пойдет не так, у меня будет пользователь, созданный без роли.
Так что мне было интересно, можно ли присоединиться к двум SqlCommand
, учитывая, что мне нужен Scope_Identity
для вставки в User_Role
. Или выполнить откат последнего исключения исключений для обоих Insert?
Создайте хранимую процедуру, которая делает все это за одну транзакцию. Один из них терпит неудачу. – mxix
+1 к сохраненному подходу proc. Как другой подход, что уникально для таблицы пользователя? 'Email'? Если это так, вы можете изменить инструкцию 'INSERT INTO User_Role' для' select User_Id от пользователей, где Email = @ Email'. Если пользовательская вставка не удалась, значит, что 'Email' не будет в пользовательской таблице, поэтому не вставлять какие-либо данные в таблицу соединений роли. –
Пробовал создавать хранимую процедуру и работал. Никогда не думал об этом, так как я никогда не использовал/не создал. –