首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

EF -设置Identity不是主键,然后用作另一个表中的外键

EF (Entity Framework) 是一种用于.NET开发的对象关系映射(ORM)框架,它允许开发人员通过使用面向对象的方式来操作数据库。在EF中,可以使用Data Annotations或Fluent API来配置实体类的属性和关系。

针对你提到的问题,如果我们想在EF中设置Identity属性不作为主键,但作为另一个表中的外键,可以通过以下步骤实现:

  1. 创建实体类: 首先,我们需要创建两个实体类,一个表示主表,另一个表示从表。在主表实体类中,我们将设置Identity属性不作为主键,而在从表实体类中,我们将使用该属性作为外键。
  2. 配置主表实体类: 使用Data Annotations或Fluent API,我们可以配置主表实体类的属性和关系。在这里,我们需要将Identity属性标记为不作为主键,并设置它与从表实体类的关系。

使用Data Annotations的示例:

代码语言:csharp
复制

public class MainEntity

{

代码语言:txt
复制
   [Key]
代码语言:txt
复制
   public int PrimaryKey { get; set; }
代码语言:txt
复制
   [DatabaseGenerated(DatabaseGeneratedOption.None)]
代码语言:txt
复制
   public int IdentityProperty { get; set; }
代码语言:txt
复制
   // Other properties
代码语言:txt
复制
   public ICollection<ChildEntity> ChildEntities { get; set; }

}

代码语言:txt
复制

使用Fluent API的示例:

代码语言:csharp
复制

public class MainEntityConfiguration : EntityTypeConfiguration<MainEntity>

{

代码语言:txt
复制
   public MainEntityConfiguration()
代码语言:txt
复制
   {
代码语言:txt
复制
       HasKey(e => e.PrimaryKey);
代码语言:txt
复制
       Property(e => e.IdentityProperty)
代码语言:txt
复制
           .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
代码语言:txt
复制
       // Other configurations
代码语言:txt
复制
       HasMany(e => e.ChildEntities)
代码语言:txt
复制
           .WithRequired(e => e.MainEntity)
代码语言:txt
复制
           .HasForeignKey(e => e.IdentityProperty);
代码语言:txt
复制
   }

}

代码语言:txt
复制
  1. 配置从表实体类: 在从表实体类中,我们需要设置Identity属性作为外键,并指定它与主表实体类的关系。

使用Data Annotations的示例:

代码语言:csharp
复制

public class ChildEntity

{

代码语言:txt
复制
   [Key]
代码语言:txt
复制
   public int PrimaryKey { get; set; }
代码语言:txt
复制
   public int IdentityProperty { get; set; }
代码语言:txt
复制
   // Other properties
代码语言:txt
复制
   [ForeignKey("IdentityProperty")]
代码语言:txt
复制
   public MainEntity MainEntity { get; set; }

}

代码语言:txt
复制

使用Fluent API的示例:

代码语言:csharp
复制

public class ChildEntityConfiguration : EntityTypeConfiguration<ChildEntity>

{

代码语言:txt
复制
   public ChildEntityConfiguration()
代码语言:txt
复制
   {
代码语言:txt
复制
       HasKey(e => e.PrimaryKey);
代码语言:txt
复制
       Property(e => e.IdentityProperty);
代码语言:txt
复制
       // Other configurations
代码语言:txt
复制
       HasRequired(e => e.MainEntity)
代码语言:txt
复制
           .WithMany(e => e.ChildEntities)
代码语言:txt
复制
           .HasForeignKey(e => e.IdentityProperty);
代码语言:txt
复制
   }

}

代码语言:txt
复制

通过以上步骤,我们成功地将Identity属性设置为不作为主键,同时作为另一个表中的外键。这样,我们可以在EF中进行数据操作,并维护两个表之间的关系。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云数据库 TencentDB:提供高性能、可扩展的云数据库服务,适用于各种规模和类型的应用。
  • 腾讯云云服务器 CVM:提供弹性计算能力,可快速创建和管理云服务器实例,满足不同业务需求。
  • 腾讯云对象存储 COS:提供安全、稳定、低成本的云端存储服务,适用于图片、音视频、文档等各种类型的数据存储和管理。
  • 腾讯云人工智能 AI:提供丰富的人工智能服务,包括图像识别、语音识别、自然语言处理等,帮助开发者构建智能化应用。
  • 腾讯云物联网 IoT:提供全面的物联网解决方案,包括设备连接、数据采集、远程控制等功能,支持各种物联网应用场景。
  • 腾讯云区块链 TBaaS:提供安全、高效的区块链服务,帮助企业构建和管理区块链网络,实现可信数据交换和合作。
  • 腾讯云音视频处理 VOD:提供音视频处理和分发服务,包括转码、截图、水印、内容审核等功能,适用于各种音视频应用场景。

请注意,以上产品仅作为示例,你可以根据具体需求选择适合的腾讯云产品。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

EntityFramework Core 学习扫盲

主键 默认情况下,EF CORE会将实体命名为Id或者[TypeName]Id属性映射为数据库主键。当然有些开发者不喜欢将主键命名为Id,EF CORE也提供了两种方式进行主键相关设置。...备用 Alternate Keys是EF CORE引入新功能,EF 6.X版本并没有此功能。备用可以用作实体主键和索引唯一标识符,还可以用作目标。...在Fluent Api,有两种方法可以指定备用,一种是当开发者将实体属性作为另一个实体目标,另一种是手动指定。EF CORE默认约束是前者。...再次重申一遍,备用主键有相似之处,它通常用来指定一个明确目标——当开发者不想用单纯无意义Id作为标识时。...虽然主体也包括主键,但是主键EF CORE时强制定义,所以HasPrincipalKey只会将属性配置为备用。 2.

9.5K90

EF 约定介绍

,该集合属性里面的元素是另一个实体时,则默认未一对多关系,即使没有显示指定一对多关系,EF会默认设置主外(主从)关系 (3)、一对一实体关系,需要手动设置主从关系 (4)、多对多无载荷关系实体...如果主键属性类型为数字型或 GUID 则会被当成标识列(Identity Column) 4、关系(/导航属性)约定Relationship(Foreign Key/Navigation Properties...除了导航属性规定实体间关系,属性来式规定实体间方式一种手段.Code First能够推断以下命名属性为(优先级从上到下): (1)、导航属性名+关联实体主键名 (2)、关联实体实体名+...关联实体主键名 (3)、关联实体主键名 注: (1)、当关系被检测到,Code First会根据可空性来推断关系具体形式;如果属性是可空,那么关系会被设置为可选,否则,关系就是必选.... (2)、当关联实体属性被设置为不为空,Code First会设置级联删除,反之不会。

1.6K100

EF 通过DataAnnotations配置属性和类型

一、通过Attribute配置约束 1、主键约束 通过KeyAttribute来配置主键约束,代码如下: [Key] public int PrimaryKey{ get; set; } 2、约束...)] public int PrimaryKey{ get; set; } 注意,指定列名存在(必须存在),如上面的ForeignKey,则类必须存在名称为ForeignKey属性。...类带string参数构造函数设置,代码如下: [Table("Class")] public class ClassInfo {} 8、列值GUID化 当主键值需要自GUID化,则需要在对主键字段设置主键约束基础上追加...11、忽略列映射 当实体类定义了某些字段,这些字段是通过一些计算或者合并得到,我们并不需要将它同步到数据库,就可以通过配置不让它生成到数据库,EF通过NotMappedAttribute特性来设置...以上是按照指定约束所生成

1.1K50

C# 数据操作系列 - 6 EF Core 配置映射关系

对于主键,默认情况下EF会检索实体类有没有名为Id或者类名+Id属性,如果有EF则认为这个属性是主键,否则会认为该类没有设置主键EF检索到主键类型是数字类型的话,会自动添加自增长约束。...对于其他属性,EF会自动按照同名形式映射到数据。 对于,如果在类里添加了引用类型,而这个引用类型也在EF上下文中,EF会把这种属性称为导航属性。...EF一旦在类里检索到了导航属性,就会去寻找对应EF会认为 属性名+Id或者类名+Id 可能是属性,如果找到名称一致且类型与导航属性目标类主键类型一致,则认为是。...如果类型不一致,EF则认为该类设置有误。如果没找到符合名称要求属性,EF会自己添加一个属性。 对于一对一,EF要求导航属性双方都应该具有配置。 一对多,EF要求多一方设置。...同时如果在一方这边设置了集合类型导航属性,那么EF会自动到目标类里寻找属性。 说完了一对一和一对多,那么多对多呢? 如果没有声明的话, EF会生成一个中间。 2.

2.7K21

Entity Framework 多对多映射

上一篇文章我们讲解了EF一对对多关系映射,这篇文章我们讲解EF多对多(Many-to-Many Relationship)关系映射。...这个第三张被称为关联或链接,这张存存储了学生和课程主键(或被能够区分唯一性字段)。...我们为了实现学生和课程多对多关系,于是定义了关联,并且设置了这个关联两个名称。...注: 在设置多对多关系时候,如果不定义 MapLeftKey 和 MapRightKey EF将默认使用 实体类型_id 。...在本例如果不定义这两个名称的话,EF默认使用名称是 Student_Id 和 Courses_Id; MapLeftKey 是关系 下面我们编写一段代码来测试一下数据库生成是否是多对多关系

1K20

约束

一:类型 约束类型一共分三种 域约束:      涉及一个或多个列,(限制某一列数据大于0) 实体约束:     相同值不能存在于其他 引用完整性约束:  一个一个列与某个另一个值匹配...约束用在确保数据完整性和两个之间关系上 先看例子 create table orders ( id     int     identity  not null   primary key,...foreign  key  references  customer(id), orderdate    smalldatetime   not null, eid   int  not null ) 注意:这个必须是另一个主键...  必须允许为null     要不是不允许插入(避免对最初行需要) 一个另一个有约束,这个是不能被删除   级联操作 先看例子 create       table       orderdetails..., 与之相关orderdetails记录也将被删除 级联深度是没有限制,但是每个都必须设置on      delete   cacade  no action是可选 五:unique

80410

Entity Framework 一对一关系映射

其中 MemberId 就是在 OrderMap 设置别名 一、 HasOptionl then WithOptionalPrincipal 现在我们修改一下 MemberMap 和 OrderMap...我们看到 Order Member_Id 字段是EF自动生成,且不可为空 二、 HasOptionl then WithOptionalDependent 再次修改 MemberMap 和...和上一小节生成数据库相比,这一小节生成数据库 Member 自动生成了 Order Order_Id ,而 Order 没有生成任何。...注:使用 WithOptionalPrincipal 可以使实体作为主体,将包含关系主键。使用 WithOptionalDependent 可以使实体作为以来提,将包含关系。...前面所讲都是从 Member 入手,我们同样也可以从 Order 入手,但是在实际开发我不建议这么做。下面就来说一下从 Order 入手方法。

80520

JPA实体类注解

,例如我们用hibernate实现就是有hibernate来控制   GenerationType总共有四个:   AUTO:   TABLE:由一个来维护主键,这个表记录上一次生成主键然后+1...给作为新主键,这种方式效率比较低   SEQUENCE:根据底层数据库序列来生成主键,条件是数据库支持序列   IDENTITY主键增长有数据来维护,可能不同数据库有不同策略  @Column...joinColum指关系维护端本身 总结 关系被维护端用mapperBy来定义关系 关系维护端用joinColum来指定键名称,维护或者是@JoinTable通过中间维护关系 *ToOne...@Id @Id设置对象表示符,标识实体类属性映射对应主键 @GeneratedValue 设置标识符生成策略,常与@Id一起使用  参数:strategy指定具体生成策略  方式一:@...表示一个多对一映射,该注解标注属性通常是数据库  optional:是否允许该字段为null,该属性应该根据数据库约束来确定,默认为true  可选  fetch:表示抓取策略,

3.8K70

mysql学习笔记(四)约束与索引

KEY约束约束之间关系 一、主键约束(primary key constraint)  主键创建时默认会自动生成约束,也可通过显示声明。 ...一个可以有很多约束 约束需要一个两个字段或者两个两个字段之间建立约束 约束一定是在从、子表建立。...例如学生和课程所在,依赖主表。...set null方式:主动权在主表上,如果主表被依赖字段修改了,从字段会将值设置为Null,这里要求,字段不能有非空约束。...set default方式:主动权在主表上,如果主表被依赖字段修改了,从字段会将值设置为default,这里要求,字段必须有默认约束。

2K00

Hibernate框架学习之注解配置关系映射

@JoinColumn用于配置列,name属性用于指定列名,Hibernate将会在userinfo增加一个字段用做列。...这里@JoinColumn是不一样,它将生成一个字段,但不是生成在本实体类所代表数据,而是生成在被关联数据。...,hibernate首先会为我们插入四条userinfo记录到userinfo(其中字段为空),然后插入一条记录到usersex,在这之后,hibernate将根据set集合元素依次执行这么一条...显然,根据集合每个元素id值定位userinfo,并将这些元素字段同一赋值为当前usersex实例主键值。这样两张就形成了对应关系了。...有人可能会有疑问,usercode一端放弃对关系管理没有设置列,那么我们是如何通过usercode获得userinfo引用呢?

2.2K90

MySQL基础之常见约束和标识列

至多有1个 | √,但不推荐 | | 唯一 | √ | √ | 可以有多个 | √,但不推荐 | : 1、要求在从设置关系...2、从类型和主表关联列类型要求一致或兼容,名称无要求 3、主表关联列必须是一个key(一般是主键或唯一) 4、插入数据时,先插入主表,再插入从 删除数据时,先删除从,再删除主表...); CREATE TABLE major( id INT PRIMARY KEY, majorName VARCHAR(20) ); #查看stuinfo所有索引,包括主键、唯一...fk_stuinfo_major FOREIGN KEY(majorid) REFERENCES major(id)# ); SHOW INDEX FROM stuinfo; 通用写法:★...3、标识列类型只能是数值型 4、标识列可以通过 SET auto_increment_increment=3;设置步长 可以通过 手动插入值,设置起始值 创建设置标识列 DROP TABLE

61310

在PowerDesigner设计物理模型1——和主外

Name是模型上显示名称,Code是生成实际名,后面的3个复选框P代办主键、F代表,M代表不能为空。...2.选中一个列,然后单击工具栏“属性”按钮,系统将弹出列属性窗口,在该窗口中可以设置该列各种属性,当然也包括该列是否是否是主键。另外还有一个很重要复选框是“Identity”。...另外需要注意是,在建立主键时,系统会在主键上建立索引,索引分为聚集索引和非聚集索引,在“属性”窗口General选项卡可以设置主键上建立索引是聚集索引还是非聚集索引,如图所示: 如果是由概念模型或者逻辑模型生成物理模型...,那么是通过Relationship生成,也可以通过工具栏Reference来实现两之间关系。...”按钮,然后在设计面板,课程上按下鼠标左键,并拖拽到教师表中放开鼠标,这时如果课程没有RoomID列,系统会自动创建RoomID列并创建该列上引用,如果已经存在RoomID列,则只添加引用

2K10

张高兴 Entity Framework Core 即学即用:(一)创建第一个 EF Core 应用

对数据库主键进行映射,使用 Key() Attribute。...当主键是自增时,还需要设置 DatabaseGenerated() Attribute。...在设置导航属性之前,首先需要理清楚医院和医生存在着怎样数量关系,医生是医院附属,一家医院下面会有多名医生,因此医院和医生之间是一对多关系。为了方便理解,下面只保留主键和导航属性。...("id")] public int Id { get; set; } public virtual List Doctors { get; set; } } 数据库之间通过建立数量关系...,在 .NET 字符串并不是加密,密码可能会短暂出现在内存,或是对程序反编译都可能会造成密码泄露。

2.4K10

MySQL约束

关系是关系数据库重要组成部分。关系是一个一个或几个属性,用来标识该每一行或与另一个产生联系。...primary key一般在逻辑设计中用作记录标识,这也是设置primary key本来用意。而unique key只是为了保证域/域组唯一性 2 (foreign key) 又称外部。...在关系数据库,每个数据都是由关系来连系彼此关系,父数据(Parent Entity)主键(primary key)会放在另一个数据,当做属性以创建彼此关系,而这个属性就是。...注意 : 不一定要与相应主键同名,只是在应用为便于识别,当主键与相应属于不同关系时,往往取同名 作用 保持数据一致性,完整性,主要目的是控制存储在外数据。...这时,数据库允许插入,并不会对插入数据做关系检查。 然而在设置时,你插入2学号字段值必须要求在1学号字段能找到。

6.5K20

Entity Framework 4.1 Code-First 学习笔记

EF 将会创建一个名为 dbo.EdmMetadata 然后将模型结构 Hash 保存到其中来实现。   如果数据库不存在,EF 将会创建它,创建什么数据库呢?...方法,然后将Order类映射到efdemo架构Order,再然后为OrderID设置规则,规定它为标识列,自增,不能为空,且映射到TheOrderID列上面。...每个类型一张 TPT: 在继承层次每个类都分别映射到数据库一张,彼此之间通过关联。...从另一个方面来说,也不能覆盖列映射。   ...另外一个 EF 映射管理方法是使用 Entity SQL,这种方式是 EF 将实体模型转换为物理模型,然后将Linq查询添加到物理模型,最后将物理模型转换为数据库存储查询。

1.6K10

生成迁移类

数据库该主键Id是int自增。Id为1数据曾经存在过,但是被我删除了。...看红线那两句话,EFCore在执行过程临时更改了设置,可以插入主键值,然后又禁用了插入主键。...下面看看一次性添加Province和City是否可以行,我直接在HasData方法里这样写: 然后Add-Migration 这样做不行。我必须单独添加City种子数据,并且设置。...所以正确做法是: 这次Add-Migration没有报错,迁移也成功了,看一下最后数据: OK 如果无法在Model里设置主键/ 有时,我们在主从关系Model里不明确定义;有时候我们...Model主键是private set; 这时我们就无法在HasData里设置主键/值了,那么如何来添加种子数据呢?

1K10

Entity Framework Core 2.1,添加种子数据

数据库该主键Id是int自增。Id为1数据曾经存在过,但是被我删除了。 然后看看会发生什么 生成迁移类 命令:Add-Migration Xxx 看一下生成迁移类内容: ?...看红线那两句话,EFCore在执行过程临时更改了设置,可以插入主键值,然后又禁用了插入主键。 数据库里面的数据 ?...然后Add-Migration ? 这样做不行。我必须单独添加City种子数据,并且设置。 所以正确做法是: ?...OK 如果无法在Model里设置主键/ 有时,我们在主从关系Model里不明确定义;有时候我们Model主键是private set; 这时我们就无法在HasData里设置主键/值了...我把City Model里去掉(导航属性仍然保留,和Province主从关系依然存在): ? 然后就可以这样添加种子数据: ? 迁移后数据: ? 结果仍然如预期一样。

1.6K10

Entity Framework 基础知识走马观花

例如:NavigationProperty 导航属性,因为T_Person与T_Class、T_Message都存在一对一或一对多关系(即存在外),因此在EF模型所生成对象实体,加入了所在实体导航属性...(2)针对外延迟加载   首先,我们有这样两张,他们是1:N关系;其中ClassId是T_Person; ?   ...与延迟加载相对应,在开发如果使用ToList()方法,EF会根据方法条件自动生成SQL语句,然后立即与数据库进行交互获取查询结果,并加载到内存中去。   ...3.3 使用Include提高查询效率   前面我们看到了延迟加载在EF中被广泛应用,但是延迟加载对于加载也存在不足:那就是每次调用实体都会去查数据库。   ...,将连接查询到T_Person部分数据存入T_ClassT_Person属性,也就是都存入了内存,后面再次访问实体只需要从内存读取而不用再发出多个数据库查询请求了。

1.3K20
领券