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



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

,如果我们可以在不提出其他请求的情况下添加用户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();

update

我还想知道是否有某种方法可以做
context.UserLogins.Single(l => l == login);
而不是

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

因为我在许多领域的大型类中使用了相同的方法。

根据您的需求可能有所不同,但您可以拥有类似的东西:

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

您的模型的关系似乎是错误的,但是根据您的信息,您可以拥有:

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

对于问题

dbset.add(object 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()的调用需要多次打开数据库连接。为了优化性能,您可以使用存储过程,因为它们每个任务只需要一个连接。了解更多信息。

促进性能考虑

当我使用数据库的第一种方法时,我发现此链接也很有帮助。

在实体框架中使用存储过程

谢谢:(

最新更新