DBSet.Add(对象o)的返回值是多少

时间:2019-05-24 07:06:51

标签: asp.net-mvc entity-framework

考虑情况。
我有一个用户登录表。 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();  

如果我们能够获得userRecentlyAdded的用户ID,而又不提出另一个请求,那么我希望它变得更简单。

我的意思是,如果可能的话,我想这样做。

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 :(得分:0)

根据您的需要可以有所不同,但是您可以使用类似的东西

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();

答案 1 :(得分:0)

您的模型关系似乎不正确,但是根据您的信息,您可以做到这一点:

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);对您不起作用!您必须根据模型关键字而不是整个模型数据来查询数据库!

答案 2 :(得分:0)

问题

  

DBSet.Add(对象o)的返回值是什么

答案是:它将返回相同的object o(即没有用户ID)。仅仅因为userididentity列并且依赖于数据库,所以它的值仅在调用context.SaveChanges()之后可用。由于Add()方法仅注册在调用SaveChanges()之后发生的更改。

有关更新的答案,
而不是使用

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

对于具有许多字段的类,我可以检查是否有任何唯一的列。例如。我可以简单地使用

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

仅因为在问题中指定了username(unique)

我宁愿建议人们使用单个Stored Procedurecontext.SaveChanges()context.xyz.Single()的调用需要多次打开数据库连接。为了优化性能,可以使用存储过程,因为每个任务只需要一个连接即可。了解更多信息。

Understang Performance Considerations

当我使用数据库优先方法时,我发现此链接也很有帮助。

Use Stored Procedure in Entity Framework

谢谢:)