简体   繁体   English

EntityFramework代码第一个键

[英]EntityFramework code first keys

I have following tables: User, UserGroups, and UserInGroups. 我有以下表格:User,UserGroups和UserInGroups。 You can see them on picture below. 您可以在下面的图片中看到它们。 When i call User i want to be able to get Groups that user is in (UserInGroups). 当我打电话给用户时,我希望能够获得该用户所在的网上论坛(UserInGroups)。 I am reading materials about EntityFramework but i am unable to make connections in code to to that, what am i missing? 我正在阅读有关EntityFramework的资料,但是我无法在代码中与之建立连接,我缺少什么? Do i need to connect them onModelCreating? 我需要在ModelCreating上连接它们吗?

Currently i am not getting any data from UserInGroup or UserGroups. 目前,我没有从UserInGroup或UserGroups获取任何数据。

DB looks like this DB看起来像这样 在此处输入图片说明

My classes look like this: 我的课程如下所示:

public class User : BaseEntity
{
    public int RoleId { get; set; }

    public Role Role { get; set; }

    public UserGroup UserGroup { get; set; }

    public UserInGroup UserInGroup { get; set; }

}

public class UserGroup : BaseEntity
{
    public UserGroup()
    {
        Users = new List<User>();
        UserInGroups = new List<UserInGroup>();
    }

    [StringLength(255)]
    public string Name { get; set; }

    public string KeyName { get; set; }

    public List<User> Users { get; set; }

    public List<UserInGroup> UserInGroups { get; set; }

}

public class UserInGroup : BaseEntity
{
    public UserInGroup()
    {
        Users = new List<User>();
        UserGroups = new List<UserGroup>();
    }

    public int UserId { get; set; }

    public User User { get; set; }

    public int UserGroupId { get; set; }

    public UserGroup UserGroup { get; set; }

    public List<User> Users { get; set; }

    public List<UserGroup> UserGroups { get; set; }

}

DbContext: 的DbContext:

public DbSet<GlobalSettings> GlobalSettings { get; set; }
    public DbSet<Role> Roles { get; set; }
    public DbSet<User> Users { get; set; }
    public DbSet<UserGroup> UserGroups { get; set; }
    public DbSet<UserInGroup> UsersInGroups { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<GlobalSettings>().Property(x => x.Key).HasColumnAnnotation("Index", new IndexAnnotation(new[] { new IndexAttribute("Index_VariablenName") { IsClustered = false, IsUnique = true } }));
    }
public abstract partial class BaseEntity
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; }
}

public class User : BaseEntity
{
    public string Username { get; set; }
    public string Title { get; set; }
    public FirstName { get; set; }
    public string LasName { get; set; }
    public Genders Gender { get; set; }
    public string Email { get; set; }
    public int RoleId { get; set; }
    public string TechUser { get; set; }
    public DateTime TechChangeDate { get; set; }
    public int TechVersion { get; set; }
    public bool IsDeleted { get; set; }

    public virtual Role Role { get; set; }
    public virtual ICollection<UserInGroup> UserInGroups { get; set; }
}

public class UserInGroup : BaseEntity
{
    public int UserId { get; set; }
    public int UserGroupId { get; set; }
    public string TechUser { get; set; }
    public DateTime TechChangeDate { get; set; }
    public int TechVersion { get; set; }
    public bool IsDeleted { get; set; }

    public virtual User User { get; set; }
    public virtual UserGroup UserGroup { get; set; }
}

public class UserGroup : BaseEntity
{
    public string Name { get; set; }
    public string KeyName { get; set; }
    public string TechUser { get; set; }
    public DateTime TechChangeDate { get; set; }
    public int TechVersion { get; set; }
    public bool IsDeleted { get; set; }
}

public class Role : BaseEntity
{
    public string Name { get; set; }
}

public enum Genders 
{
    Male = 1,
    Female = 2
}

You can use two methods to fill navigation properties. 您可以使用两种方法来填充导航属性。 First is lazy-loading and second is explicit specifying of required properties. 首先是延迟加载,其次是显式指定所需的属性。

For lazy-loading you should declare your navigation properties as virtual : 对于延迟加载,应将导航属性声明为virtual

public class User : BaseEntity
{
    public int RoleId { get; set; }

    public virtual Role Role { get; set; }

    public virtual UserGroup UserGroup { get; set; }

    public virtual UserInGroup UserInGroup { get; set; }
}

public class UserGroup : BaseEntity
{
    public UserGroup()
    {
        Users = new HashSet<User>(); // HashSet is more effective than List
        UserInGroups = new HashSet<UserInGroup>();
    }

    [StringLength(255)]
    public string Name { get; set; }

    public string KeyName { get; set; }

    public virtual ICollection<User> Users { get; set; } // ICollection is less restrective

    public virtual ICollection<UserInGroup> UserInGroups { get; set; }
}

Now, you can load fe single user: 现在,您可以加载fe个用户:

var justUser = dbContext.Users.Single(u => u.Id == 100);

When you need its properties they will by transparently loaded: 当您需要其属性时,它们将被透明地加载:

foreach (var userInGroup in user.UsersInGroups) // here is second loading
{
    . . .
}

The second way is the calling of the Include method to explicit specifying required properties: 第二种方法是调用Include方法以显式指定所需的属性:

var userWithGroups = dbContext.Users
                              .Include(u => u.UserInGroups) // include single navigation property
                              .Include(ugs => ugs.Groups.Select(ug => ug.Group)) // include collection navigation property
                              .Single(u => u.Id == 100); // get the user with specified id and filled specified properties

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM