假设,我有以下'创建表'脚本:
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类指定外键关系?
答案 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设置关联,而不必加载整个引用的对象。
这将为您提供与您所做的定义相匹配的表格,除了:
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标识,负责为您处理用户。