EntityFramework 建立一对一关系
前言:本来要使用实体拆分实现一对一,但发现查询时无法单独查询,影响效率,故改用手动建立一对一关系
例:
实体类:
public class TestDbContext : DbContext
{
public DbSet<Test> Tests { get; set; }
public DbSet<TestUnitPrice> TestUnitPrices { get; set; } public TestDbContext() : base() { } protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//base.OnModelCreating(modelBuilder); //一对一关系中,依赖对象的主键与外键会被修改为同一个,所以在此要再次设置一下依赖对象的主键
modelBuilder.Entity<TestUnitPrice>().HasKey(t => t.ID);
//设置主体对象
modelBuilder.Entity<Test>().HasRequired(t => t.UnitPrice).WithRequiredPrincipal();
} } public class Test
{
public long ID { get; set; } public string Name { get; set; }
public string Remarks { get; set; }
//导航属性
public virtual TestUnitPrice UnitPrice { get; set; }
} public class TestUnitPrice
{
public long ID { get; set; } public decimal UnitPrice { get; set; }
public string Remarks { get; set; }
}
对应的数据库为:
添加数据:(主体记录与依赖记录的 ID 将自动设置为相同值)
TestDbContext db = new TestDbContext();
//添加对象,记得同时添加依赖对象
db.Tests.Add(new Test() {
Name = "测试1",
Remarks = "测试1备注",
UnitPrice = new TestUnitPrice() {
UnitPrice = ,
Remarks = "测试1单价备注" } });
db.SaveChanges();
此时将生成两条SQL语句:
exec sp_executesql N'INSERT [dbo].[Tests]([Name], [Remarks])
VALUES (@0, @1)
SELECT [ID]
FROM [dbo].[Tests]
WHERE @@ROWCOUNT > 0 AND [ID] = scope_identity()',N'@0 nvarchar(max) ,@1 nvarchar(max) ',@0=N'测试1',@1=N'测试1备注'
exec sp_executesql N'INSERT [dbo].[TestUnitPrices]([ID], [UnitPrice], [Remarks])
VALUES (@0, @1, @2)
',N'@0 bigint,@1 decimal(18,2),@2 nvarchar(max) ',@0=2,@1=10.00,@2=N'测试1单价备注'
同时更新主体和依赖数据:
TestDbContext db = new TestDbContext();
var test = db.Tests.Find();
test.Remarks = "更新主实体字段01";
test.UnitPrice.Remarks = "更新依赖实体字段01"; db.SaveChanges();
此时将生产四条SQL语句,两条查询,两条更新
exec sp_executesql N'SELECT TOP (2)
[Extent1].[ID] AS [ID],
[Extent1].[Name] AS [Name],
[Extent1].[Remarks] AS [Remarks]
FROM [dbo].[Tests] AS [Extent1]
WHERE [Extent1].[ID] = @p0',N'@p0 int',@p0=1
exec sp_executesql N'SELECT
[Extent1].[ID] AS [ID],
[Extent1].[UnitPrice] AS [UnitPrice],
[Extent1].[Remarks] AS [Remarks]
FROM [dbo].[TestUnitPrices] AS [Extent1]
WHERE [Extent1].[ID] = @EntityKeyValue1',N'@EntityKeyValue1 bigint',@EntityKeyValue1=1
exec sp_executesql N'UPDATE [dbo].[Tests]
SET [Remarks] = @0
WHERE ([ID] = @1)
',N'@0 nvarchar(max) ,@1 bigint',@0=N'更新主实体字段01',@1=1
exec sp_executesql N'UPDATE [dbo].[TestUnitPrices]
SET [Remarks] = @0
WHERE ([ID] = @1)
',N'@0 nvarchar(max) ,@1 bigint',@0=N'更新依赖实体字段01',@1=1
单独更新主体数据:
TestDbContext db = new TestDbContext();
var test = db.Tests.Find();
test.Remarks = "更新主实体字段1"; db.SaveChanges();
SQL:
exec sp_executesql N'SELECT TOP (2)
[Extent1].[ID] AS [ID],
[Extent1].[Name] AS [Name],
[Extent1].[Remarks] AS [Remarks]
FROM [dbo].[Tests] AS [Extent1]
WHERE [Extent1].[ID] = @p0',N'@p0 int',@p0=1
exec sp_executesql N'UPDATE [dbo].[Tests]
SET [Remarks] = @0
WHERE ([ID] = @1)
',N'@0 nvarchar(max) ,@1 bigint',@0=N'更新主实体字段1',@1=1
单独更新依赖数据:
TestDbContext db = new TestDbContext();
var test = db.TestUnitPrices.Find();
test.Remarks = "更新依赖实体字段1"; db.SaveChanges();
SQL:
exec sp_executesql N'SELECT TOP (2)
[Extent1].[ID] AS [ID],
[Extent1].[UnitPrice] AS [UnitPrice],
[Extent1].[Remarks] AS [Remarks]
FROM [dbo].[TestUnitPrices] AS [Extent1]
WHERE [Extent1].[ID] = @p0',N'@p0 int',@p0=1
exec sp_executesql N'UPDATE [dbo].[TestUnitPrices]
SET [Remarks] = @0
WHERE ([ID] = @1)
',N'@0 nvarchar(max) ,@1 bigint',@0=N'更新依赖实体字段1',@1=1
简单查询与删除
TestDbContext db = new TestDbContext();
var test = db.Tests.Include("UnitPrice").First(t => t.ID == );
db.Tests.Remove(test); db.SaveChanges();
EntityFramework 建立一对一关系的更多相关文章
- EntityFramework之一对一关系(二)
前言 关于表关系园中文章也是数不胜收,但是个人觉得最难攻克的是一对一,对其配置并非无道理可循,只要掌握了原理方可,且听我娓娓道来! 共享主键关系 概念:就是两个表共享相同的主键值,也就是说一表的主键值 ...
- 问题记录:EntityFramework 一对一关系映射
EntityFramework 一对一关系映射有很多种,比如主键作为关联,配置比较简单,示例代码: public class Teacher { public int Id { get; set; } ...
- EntityFramework Core映射关系详解
前言 Hello,开始回归开始每周更新一到两篇博客,本节我们回归下EF Core基础,来讲述EF Core中到底是如何映射的,废话少说,我们开始. One-Many Relationship(一对多关 ...
- Entity Framework - 基于外键关联的单向一对一关系
代码的世界,原以为世界关系很简单,确道是关系无处不在.NET世界里ORM框架中EntityFramework作为其中翘楚,大大解放了搬砖工作的重复工作,着实提高了不少生产力,而也碰到过不少问题!比如关 ...
- 创建以mybatis为基础的web项目(2)mabitis中的一对一关系项目实战
mabitis中的一对一关系项目实战: 1.首先根据创建以mybatis为基础的web项目(1)中的流程将web项目部署好 打开IDE,建立web工程 在lib下面粘贴mybatis的jar,log4 ...
- Entity Framework管理实体关系(一):管理一对一关系
我们现在已经知道如何使用Code First来定义简单的领域类,并且如何使用DbContext类来执行数据库操作.现在我们来看下数据库理论中的多样性关系,我们会使用Code First来实现下面的几种 ...
- Hibernate_8_Person和IdCard实例_一对一关系:基于外键
1)建立Person类: public class Person { private Integer id; private String name; private IdCard IdCard; p ...
- 补知识:EntityFramework Core映射关系详解
前言 本节我们回归下EF Core基础,来讲述EF Core中到底是如何映射的,废话少说,我们开始. One-Many Relationship(一对多关系) 首先我们从最简单的一对多关系说起,我们给 ...
- 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效
数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...
随机推荐
- ubuntu下安装配置apache2(含虚拟主机配置)
在Ubuntu14.14中安装apache 安装指令: sudo apt-get install apache2 安装结束后: 产生的启动和停止文件是: /etc/init.d/apache2 启动: ...
- SQL语句性能分析常用命令
DBCC freeproccache DBCC dropcleanbuffers 1.set statistics IO {ON| OFF} /*Transact-SQL 语句生成的磁盘活动量的信息* ...
- css总结9:内边距(padding)和外边距(margin)
1 css总结9:内边距和外边距 通过css总结8:盒子模型可知:内边距(padding),外边距(margin).可以影响盒子在浏览器的位置. 1.1 padding使用:{padding:上 右 ...
- py_initialize:C调Python出错 是初始化错误?
还是pythonpath和pythonname变量没有配置正确? py_initialize()方法是什么? In an application embedding Python, this shou ...
- 编写高质量代码改善C#程序的157个建议——建议49:在Dispose模式中应提取一个受保护的虚方法
建议49:在Dispose模式中应提取一个受保护的虚方法 在标准的Dispose模式中,真正的IDisposable接口的Dispose方法并没有做实际的清理工作,它其实是调用了下面的这个带bool参 ...
- ubuntu14.04LTS下制作安装启动U盘
ubuntu自带的启动U盘制作工具在我的非UEFI电脑上无法启动,找到一个国产的好用东西:深度deepin-boot-maker. 下载地址(官方百度盘):点击下载 用起来也很简单,只需要选择下载好的 ...
- TypedValue.applyDimension的使用
TypedValue.applyDimension是一个将各种单位的值转换为像素的方法 用法TypedValue.applyDimension(int unit, float value,Displa ...
- Highsoft.Highcharts 5.0.6439.38401 key
Highcharts .NET allows developers to make charts using Highcharts API with the Microsoft .NET Framew ...
- JavaScript中function 之return false的理解(实例代码)
1.司空见惯代码,在某一dom节点上注册事件方法 $("#btnResponse").click(Login); $("#txtCode").keydown(R ...
- Vue vue-resource发送Http请求
vue-resource 1.cnpm install vue-resource --save 2.在main.js中import VueResource from 'vue-resource' 3. ...