EF不建外键添加导航属性和属性名字自定义实例

EF不建外键添加导航属性和属性名字自定义实例

8485发表于2015-07-14

最开始在学数据库理论的时候知道为了保证数据库一完整性最简单的方式,就是在表之间的字段建立外键约束。但是有时实际的开发过程却不太一样,好多有经验的开发人员或DBA都建议不用建立真正的外键,而是通过用程序约定的方式来建立一种逻辑外键关系。我认为这是基于性能和开发方便性的考虑。但是我们知道,如果采用EF Code First模式开发时,默认情况建立了导航属性和对应的关联ID就会自动为我们创建有外键的表。

现在有这样一个实际情况,当有时我们要把原来建好的备用字段(UserID),引用到的是新加的一个表(Sys_Author)的ID,而这个字段的名字我们又不想重命名。这就涉及到ef如何不建外键添加导航属性和属性名字自定义。下面请看EF不建外键添加导航属性和属性名字自定义实际的例子:

文章表Article

CREATE TABLE [dbo].[Article](
 [ID] [int] IDENTITY(1,1) NOT NULL primary key,
 [Title] [nvarchar](max) NULL,
 [Summary] [nvarchar](max) NULL,
 [Content] [nvarchar](max) NULL,
 [NewsFrom] [nvarchar](max) NULL,
 [Images] [nvarchar](max) NULL,
 [CreateTime] [datetime] NOT NULL,
 [UpdateTime] [datetime] NOT NULL,
 [KeyWords] [nvarchar](max) NULL,
 [Description] [nvarchar](max) NULL,
 [ViewCount] [int] NOT NULL,
 [CategoryID] [int] NOT NULL,
 [UserID] [int] NOT NULL,
 [Status] [int] NULL
)

UserID字段就是原来备用的字段,现在我们要把记录文章的作家ID。新建一张存储作家信息的表

Sys_Author

CREATE TABLE [dbo].[Sys_Author](
 [ID] [int] IDENTITY(2,1) NOT NULL primary key,
 [Name] [nvarchar](200) NOT NULL,
 [LoginName] [varchar](100) NOT NULL,
 [Pwd] [varchar](100) NOT NULL,
 [Enabled] [int] NOT NULL,
 [UserType] [int] NOT NULL
}

Article的Model定义

public class Article
{
	public int ID { get; set; }
	public string Title { get; set; }
	public string Summary { get; set; }
	public string Content { get; set; }
	public string NewsFrom { get; set; }
	public string Images { get; set; }
	public DateTime CreateTime { get; set; }
	public DateTime UpdateTime { get; set; }
	public string KeyWords { get; set; }
	public string Description { get; set; }
	public int ViewCount { get; set; }
	public int CategoryID { get; set; }
	[Column("UserID")]
	public int AuthorID { get; set; }
	public int Status { get; set; }
	public Category Category { get; set; }
	public virtual Sys_Author Author { get; set; }
}

备注:我们在Model里面定义一个属性AuthorID,这个属性名字我们可以任意自定义,而不定要和数据库对应字段一样,然后只需要用特性[Column]指向到名为UserID的字段就可以了,最后定义了一个类型为Sys_Author的属性Author(导航属性)。注意:这个属性Author一定要声明为virtual,不然这个Author的值始终为null。

小编蓝狐