将两个表绑定在一起(一对多关系)

本文关键字:在一起 关系 绑定 一对多 两个 | 更新日期: 2023-09-27 18:10:34

我对c#, EF Code First和所有这些都很陌生,所以我的问题可能很简单。

我正在尝试创建一个非常简单的登录。每个用户必须有一个类型(admin或client)。如何将用户类型绑定到用户表,而不必在每次向DB插入新用户时生成新类型?下面是我的代码:

public class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public bool Active { get; set; }
    public UserType TypeId { get; set; }
}
public class UserType
{
    public int Id { get; set; }
    public string Type { get; set; }
}
public enum TypeEnum
{
    Admin,
    Client
}

当我启动应用程序时,我希望能够创建2个表:

  • 为空的Users
  • UserTypes必须包含2种类型(Admin和Client)。

然后,每次我注册一个新用户,所以每次我向Users表添加一个用户,我希望能够使用UserTypes表

将两个表绑定在一起(一对多关系)

当我启动应用程序时,我希望能够创建2个表…

不确定我是否正确理解这一点,但你可以种子初始数据到数据库与EF Code-First。下面是一个示例:

实体框架在重建时插入初始数据

如果您真的想在每次启动应用程序时重新创建表,您可以使用示例中提到的DropCreateDatabaseAlways<T>初始化器。

然后,每次我注册一个新用户,所以每次我添加一个用户到我希望能够使用UserTypes表。

为此,您将从数据库加载您想要分配的现有UserType,以便将其附加到上下文,然后创建新用户:

using (var context = new MyContext())
{
    var userType = context.UserTypes
        .Single(u => u.Type == TypeEnum.Admin.ToString());
    var newUser = new User { TypeId = userType, Username = ... etc. };
    context.Users.Add(newUser);
    context.SaveChanges();
}

附加到上下文-通过从数据库加载或显式调用Attach -确保UserType不重复,即没有INSERT命令将被发送到UserType的数据库。

使用新版本的EF(目前超过了官方4.1版本:实体框架2011年6月CTP),您也可以这样做:

public class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
    public bool Active { get; set; }
    public UserType Type { get; set; }
}
public enum UserType
{
    Admin = 1,
    Client = 2,
}

数据将在数据库中保存为整数,但在应用程序中,您可以像这样使用enum:

    var newUser = new User { Type = UserType.Admin, Username = ... };
    context.Users.Add(newUser);
    context.SaveChanges();