【问题标题】:EntityFramework always create new relation table recordEntityFramework 总是创建新的关系表记录
【发布时间】:2014-11-06 20:51:40
【问题描述】:

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

【问题讨论】:

    标签: c# entity-framework


    【解决方案1】:

    如果您创建了用户角色(即RpUserRoles.Create(new UserRole() { Name = "System" }))并从不同的上下文中检索它(RpUserRoles.Table.Where(x =&gt; x.Name.Equals("System")).FirstOrDefault()),就会发生这种情况。 Entity Framework 不会知道它们是相同的,因此它会将第二个视为新的。看起来您正在使用 Entity Framework 的包装器 (RpUserRoles.Create, RpUserRoles.Table);它如何处理上下文?它会为每种方法创建一个吗?

    【讨论】:

    • 是的,包装器是为每个类创建一个。现在我已经通过调用实例上下文来解决了。非常感谢。
    【解决方案2】:

    你的代码应该是这样的

        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&lt;T&gt;.Create 定义是:为该集合的类型创建一个实体的新实例。请注意,此实例未添加或附加到集合中。如果底层上下文配置为创建代理并且实体类型满足创建代理的要求,则返回的实例将是一个代理。

    所以我认为您还应该将 roleSystem 和 roleAdmin 添加到上下文中

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多