EntityFramework始终创建新的关系表记录

时间:2014-11-06 20:51:41

标签: c# entity-framework

我是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时,应该没问题。我可以知道我配错了吗?感谢。

2 个答案:

答案 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添加到上下文

希望这会对你有所帮助