考虑情况。
我有一个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(。仅仅因为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()
的调用需要多次打开数据库连接。为了优化性能,您可以使用存储过程,因为它们每个任务只需要一个连接。了解更多信息。
促进性能考虑
当我使用数据库的第一种方法时,我发现此链接也很有帮助。
在实体框架中使用存储过程
谢谢:(