Каково возвращаемое значение DBSet.Add (объект o) - PullRequest
0 голосов
/ 24 мая 2019

Рассмотрим ситуацию.
У меня есть таблица userlogin.userlogin имеет следующие поля:
userid(identity(1,1)), username(unique), password(string) У меня есть другая таблица, userRole со следующими полями.
userid(fk referencing userlogin), role(string)

Теперь предположим, что яхочу добавить пользователя с правами администратора в мою пустую базу данных приложения.В настоящее время я делаю следующее:

// Check Userlogin if it contains adminuser1 as username, if not, add adminuser1 with password xyz. 

UserLogin login = new UserLogin();  
login.username = "adminuser1";  
login.password = "xyz";  
context.UserLogins.Add(login);  
context.SaveChanges();  

// query again from database to get the userid   
Userlogin user = context.UserLogins.Single(l => (l.username == "adminuser1") && (l.password == "xyz"));  
int userid = user.userid;  
UserRole admin = new UserRole();  
admin.userid = userid;  
admin.role = "admin";  
context.UserRoles.Add(admin);  
context.SaveChanges();  

Я хочу сделать его менее хлопотным, если мы можем получить идентификатор пользователя userRecently Added, не делая еще один запрос.

Я имею в виду, я хочу сделать это, если это возможно.

UserLogin login = new UserLogin();  
login.username = "adminuser1";  
login.password = "xyz";  
UserLogin user = context.UserLogins.Add(login);  
UserRole admin = new UserRole();  
admin.userid = user.userid;  
admin.role = "admin";  
context.UserRoles.Add(admin);  
context.SaveChanges();

Обновление

Я также хотел узнать, есть ли способ сделать
context.UserLogins.Single(l => l == login);
вместо

context.UserLogins.Single(l => (l.username == "adminuser1") && (l.password=="xyz"));

потому что я использую один и тот же метод в больших классах во многих областях.

Ответы [ 3 ]

0 голосов
/ 24 мая 2019

Отношения ваших моделей кажутся неправильными, но на основании вашей информации вы можете получить это:

var login = context.UserLogins.Single(_ => _.username == "adminuser1");
if (login == null)
{
  login = new UserLogin();
  login.username = "adminuser1";  
  login.password = "xyz";
  context.UserLogins.Add(login); 
  context.SaveChanges();
}
else
{
   // this user already exists.
}

var admin = context.UserRoles.Single(_ => _.role == "admin");
if (admin == null)
{
  admin.userid = login.userid;  
  admin.role = "admin"; 
  context.UserRoles.Add(admin);  
  context.SaveChanges();
}
else
{
  // the role already exists.
}

context.UserLogins.Single(l => l == login); не будет работать для вас!Вы должны запрашивать базу данных на основе ключа модели, а не целых данных модели!

0 голосов
/ 31 мая 2019

На вопрос

Что такое возвращаемое значение DBSet.Add (объект o)

Ответ: он вернет тот же object o (т.е. без идентификатора пользователя). Просто потому, что userid является столбцом identity и зависит от базы данных, его значение доступно только после вызова context.SaveChanges(). Так как метод Add() регистрирует, что изменение произойдет только после вызова SaveChanges().

Для ответа на обновление
Вместо использования

context.UserLogins.Single(l => (l.username == "adminuser1") && (l.password=="xyz"));  

Для классов, которые имеют много полей, я могу проверить, есть ли какие-нибудь уникальные столбцы. Например. Я мог бы использовать, просто

context.UserLogins.Single(l => l.username == "adminuser1");  

Только потому, что в вопросе указано username(unique).

Я бы предпочел, чтобы люди использовали один Stored Procedure. Вызовы context.SaveChanges() и context.xyz.Single() требуют многократного открытия соединения с базой данных. Для оптимизации производительности вы можете использовать хранимые процедуры, поскольку для них требуется только одно соединение для каждой задачи. Для дополнительной информации.

Вопросы производительности при недостаточной оценке

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

Использование хранимых процедур в Entity Framework

Спасибо:)

0 голосов
/ 24 мая 2019

Может отличаться в зависимости от ваших потребностей, но у вас может быть что-то вроде:

public class UserRole
{
    public int Id { get; set; }
    public string role { get; set; }
}

public class UserLogin
{
    public int Id { get; set; }
    public string username { get; set; }
    public string password { get; set; }
    public UserRole Role { get; set; }
}

и затем используйте их как:

var login = new UserLogin
{
    username = "adminuser1",
    password = "xyz"
};
var admin = context.UserRoles.Single(_=> _.role == "admin");
if (admin == null)
{
    admin = new UserRole
    {
        role = "admin"
    };
}
login.Role = admin;  
context.UserLogins.Add(login);  
context.SaveChanges();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...