我是EntityFramework的新手。我的代码如下。
User.cs
public User
{
public long Id { get; set; }
public long UserRoleId { get; set; }
public string Name { get; set; }
public virtual UserRole UserRole { get; set; }
}
public class UserMap : EntityTypeConfiguration<User>
{
public UserMap()
{
ToTable("User");
HasKey(x => x.Id);
HasRequired(x => x.UserRole)
.WithMany(x => x.Users)
.HasForeignKey(x => x.UserRoleId);
}
}
UserRole.cs
public UserRole
{
public long Id { get; set; }
public string Name { get; set; }
public virtual ICollection<User> Users { get; set; }
public UserRole()
{
Users = new List<User>();
}
}
public class UserRoleMap : EntityTypeConfiguration<UserRole>
{
public UserRoleMap()
{
ToTable("UserRole");
HasKey(x => x.Id);
}
}
Install.cs
public Install
{
public static void Install()
{
RpUserRoles.Create(new UserRole() { Name = "System" });
RpUserRoles.Create(new UserRole() { Name = "Admin" });
var roleSystem = RpUserRoles.Table.Where(x => x.Name.Equals("System")).FirstOrDefault();
User userSystem = new User();
userSystem.Name = "UserSystem";
userSystem.UserRole = roleSystem;
RpUser.Create(userSystem);
var roleAdmin = RpUserRoles.Table.Where(x => x.Name.Equals("Admin")).FirstOrDefault();
User userAdmin = new User();
userAdmin.Name = "UserAdmin";
userAdmin.UserRoleId = roleAdmin.Id;
RpUser.Create(userAdmin);
}
}
当我在数据库中创建新用户时,我在数据库中获得的结果是错误的。 EntityFramework复制关系表中的记录。结果为
User
| Id | UserRoleId | Name |
| 1 | 3 | UserSystem |
| 2 | 2 | UserAdmin |
UserRole
| Id | Name |
| 1 | System |
| 2 | Admin |
| 3 | System |
UserSystem 用户的预期UserRoleId应 1 ,但我不知道为什么EntityFramework会在UserRole表中复制新记录。当 UserAdmin 设置UserRoleId时,应该没问题。我可以知道我配错了吗?感谢。
答案 0 :(得分:0)
如果您创建UserRole(即RpUserRoles.Create(new UserRole() { Name = "System" })
)并从不同的上下文中检索它(RpUserRoles.Table.Where(x => x.Name.Equals("System")).FirstOrDefault()
),就会发生这种情况。实体框架不会知道它们是相同的,所以它会将第二个视为新的。看起来您正在使用实体框架周围的包装器(RpUserRoles.Create,RpUserRoles.Table);它是如何处理上下文的?它是否为每种方法创建一个?
答案 1 :(得分:0)
你的代码应该是这样的
var roleSystem=RpUserRoles.Create(new UserRole() { Name = "System" });
var rolAdmin=RpUserRoles.Create(new UserRole() { Name = "Admin" });
//var roleSystem = RpUserRoles.Table.Where(x => x.Name.Equals("System")).FirstOrDefault();
User userSystem = new User();
userSystem.Name = "UserSystem";
userSystem.UserRole = roleSystem;
RpUser.Create(userSystem);
//var roleAdmin = RpUserRoles.Table.Where(x => x.Name.Equals("Admin")).FirstOrDefault();
User userAdmin = new User();
userAdmin.Name = "UserAdmin";
userAdmin.UserRoleId = roleAdmin.Id;
RpUser.Create(userAdmin);
DbSet<T>.Create
定义是:为该集的类型创建实体的新实例。请注意,此实例未添加或附加到集合。如果基础上下文配置为创建代理并且实体类型满足创建代理的要求,则返回的实例将是代理。
所以我认为你应该添加还将roleSystem和roleAdmin添加到上下文
希望这会对你有所帮助