考虑情况。
我有一个用户登录表。 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"));
因为我在许多领域的大型类中使用相同的方法。
答案 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)。仅仅因为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()
的调用需要多次打开数据库连接。为了优化性能,可以使用存储过程,因为每个任务只需要一个连接即可。了解更多信息。
Understang Performance Considerations
当我使用数据库优先方法时,我发现此链接也很有帮助。
Use Stored Procedure in Entity Framework
谢谢:)