尝试创建一个通用类以减少c#代码中的冗余,我有4个类或多或少使用相同的方法(添加,获取,编辑,删除),但是当我通过实体查询数据库时框架我收到此错误。 “无法从'T'转换为'SneakerDrop.Domain.Models.User',并且'T'不包含UserId的属性
我已经将该类转换为静态类,以便能够在程序中创建新实例,以测试是否是因为我试图通过xUnit传递新数据类型。
public class Program
{
public User user = new User
{
UserId = 1,
Username = "ian2519",
Password = "Password",
Firstname = "Ian",
Lastname = "Nai",
Email = "Email@email.com"
};
public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
UserHelper<User> test = new UserHelper<User>();
Program program = new Program();
test.AddUser(program.user);
}
public class UserHelper<T>
{
private SneakerDropDbContext _db = new SneakerDropDbContext();
public bool AddUser(T user)
{
_db.Users.Add(user);
return _db.SaveChanges() == 1;
}
public T GetUserInfoById(T user)
{
T dbInfo = _db.Users.Where(u => u.UserId == user.UserId).FirstOrDefault();
return dbInfo;
}
public bool EditUserInfoById(T user)
{
var results = _db.Users.Where(u => u.UserId == user.UserId).FirstOrDefault();
results.Username = user.Username;
results.Firstname = user.Firstname;
results.Lastname = user.Lastname;
results.Password = user.Password;
results.Email = user.Email;
_db.SaveChanges();
return true;
}
}
获取错误,T无法从_db.USers.Add(用户)上的T转换 并且获取T不包含用户名,名字等的定义。 在结果行上。用户名,结果。名字...
答案 0 :(得分:1)
该类几乎没有通用的目的,需要将其限制在某种范围内。
如果您可以将其设为通用,则需要将其限制为User
(因为您未显示任何接口或子类),这会使所有通用管道变得多余。如果您在这种情况下需要帮助类,则只需使用标准类型。
public class UserHelper
{
public bool AddUser(User user)
{
_db.Users.Add(user);
return _db.SaveChanges() == 1;
}
public User GetUserInfoById(User user)
{
User dbInfo = _db.Users.Where(u => u.UserId == user.UserId).FirstOrDefault();
return dbInfo;
}
public bool EditUserInfoById(User user)
{
var results = _db.Users.Where(u => u.UserId == user.UserId).FirstOrDefault();
results.Username = user.Username;
results.Firstname = user.Firstname;
results.Lastname = user.Lastname;
results.Password = user.Password;
results.Email = user.Email;
_db.SaveChanges();
return true;
}
}
用法
UserHelper test = new UserHelper();
test.AddUser(program.user);
您似乎想做的是在EF上建立通用存储库,这只是将有用的方法隐藏在抽象层后面,使编写良好的框架复杂化,并使您的开发遇到更多问题。除非您有非常具体的需求,否则我强烈建议您这样做。