具有外键关系的POCO类

时间:2013-11-16 06:41:20

标签: c# entity-framework

假设,我有以下'创建表'脚本:

CREATE TABLE userrole
(
    id varchar(45) NOT NULL,
    name varchar(45) NOT NULL,
    description text NULL,
    PRIMARY KEY (id)
) ;

CREATE TABLE users
(
    id varchar(45) NOT NULL,
    name varchar(45) NOT NULL,
    pwd varchar(7) NOT NULL,
    userrole varchar(45) NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (userrole) REFERENCES userrole(id) ON DELETE CASCADE ON UPDATE CASCADE
) ;

如何使用POCO类指定外键关系?

2 个答案:

答案 0 :(得分:1)

使用此:

  public class User
    {
        public string id { get; set; }
        public string name { get; set; }
        public string pwd { get; set; }
        [ForeignKey("roleId")]
        public string userrole { get; set; }
        public int roleId { get; set; }
    }

    public class userrole
    {
        public string id { get; set; }
        public string name { get; set; }
        public string description { get; set; }   
        public virtual ICollection<User> Users { get; set; }
}

答案 1 :(得分:0)

使用POCO类,您可以创建导航属性,它是对另一个对象的简单C#引用。为外键创建属性也是一个好主意,因为在某些情况下,您可能希望按ID设置关联,而不必加载整个引用的对象。

这将为您提供与您所做的定义相匹配的表格,除了:

  • 外壳,因为我使用了C#name标准外壳。
  • varchar类型 - C#字符串是unicode,因此它们在SQL中映射到nvarchar。使用varchar应该被视为在国际世界中被弃用(我来自瑞典,我喜欢我们的ÅÄÖ字符)。
  • 不推荐使用的text类型,它将映射到nvarchar(max)

public class UserRole
{
  [Key]
  [Required]
  [StringLength(45)]
  public string Id { get; set; }

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

  public string Description { get; set; }
}

public class User
{
  [Key]
  [Required]
  [StringLength(45)]
  public string Id { get; set; }

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

  [Required]
  [StringLength(45)]
  public string pwd { get; set; }

  [Required]
  [StringLength(45)]
  public virtual string UserRole { get; set; }

  [Required]
  [ForeignKey("UserRole")]
  public virtual UserRole Role { get; set; }
}

这些属性用于详细定义映射: * [StringLength(45)]设置列宽。没有它,您将获得nvarchar(max)列,这些列不能成为索引的一部分。这将使他们无法用作主键。 * [Key]将列指定为列的主键。 * [Required]生成列NOT NULL

安全警报

我真的希望这只是一个例子,如果您实际上是在设计用户登录系统,那么您将通过密码处理将您的用户暴露给严重的安全问题。密码不应该以纯文本形式存储,也不能以可解密的加密方式存储(请参阅Adobe)。唯一可接受的密码存储是盐渍哈希。使用ASP.NET,您不必自己这样做,有内置的提供程序,如SimpleMembership和较新的ASP.NET标识,负责为您处理用户。