前言:本来要使用实体拆分实现一对一,但发现查询时无法单独查询,影响效率,故改用手动建立一对一关系

例:

实体类:

    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 建立一对一关系的更多相关文章

  1. EntityFramework之一对一关系(二)

    前言 关于表关系园中文章也是数不胜收,但是个人觉得最难攻克的是一对一,对其配置并非无道理可循,只要掌握了原理方可,且听我娓娓道来! 共享主键关系 概念:就是两个表共享相同的主键值,也就是说一表的主键值 ...

  2. 问题记录:EntityFramework 一对一关系映射

    EntityFramework 一对一关系映射有很多种,比如主键作为关联,配置比较简单,示例代码: public class Teacher { public int Id { get; set; } ...

  3. EntityFramework Core映射关系详解

    前言 Hello,开始回归开始每周更新一到两篇博客,本节我们回归下EF Core基础,来讲述EF Core中到底是如何映射的,废话少说,我们开始. One-Many Relationship(一对多关 ...

  4. Entity Framework - 基于外键关联的单向一对一关系

    代码的世界,原以为世界关系很简单,确道是关系无处不在.NET世界里ORM框架中EntityFramework作为其中翘楚,大大解放了搬砖工作的重复工作,着实提高了不少生产力,而也碰到过不少问题!比如关 ...

  5. 创建以mybatis为基础的web项目(2)mabitis中的一对一关系项目实战

    mabitis中的一对一关系项目实战: 1.首先根据创建以mybatis为基础的web项目(1)中的流程将web项目部署好 打开IDE,建立web工程 在lib下面粘贴mybatis的jar,log4 ...

  6. Entity Framework管理实体关系(一):管理一对一关系

    我们现在已经知道如何使用Code First来定义简单的领域类,并且如何使用DbContext类来执行数据库操作.现在我们来看下数据库理论中的多样性关系,我们会使用Code First来实现下面的几种 ...

  7. Hibernate_8_Person和IdCard实例_一对一关系:基于外键

    1)建立Person类: public class Person { private Integer id; private String name; private IdCard IdCard; p ...

  8. 补知识:EntityFramework Core映射关系详解

    前言 本节我们回归下EF Core基础,来讲述EF Core中到底是如何映射的,废话少说,我们开始. One-Many Relationship(一对多关系) 首先我们从最简单的一对多关系说起,我们给 ...

  9. 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效

    数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...

随机推荐

  1. PHP防止木马攻击的措施

    防止跳出web目录 只允许你的PHP脚本在web目录里操作,针对Apache,还可以修改httpd.conf文件限制PHP操作路径. 例如:php_admin_value  open_basedir( ...

  2. Django框架 之 Ajax

    Django框架 之 Ajax 浏览目录 AJAX准备知识 AJAX与XML的比较 AJAX简介 jQuery实现的ajax AJAX参数 AJAX请求如何设置csrf_token 序列化 一.AJA ...

  3. 专题1-MMU-lesson1-MMU功能解析

    1.Memory Management Unit(存储器管理单元) 单片机与ARM在硬件体系上的一些区别:其中就有MMU的区别. 虚拟地址的使用 把p1.c复制成P2.c,把变量a改成b,再进行编译看 ...

  4. Tarjan算法求出强连通分量(包含若干个节点)

    [功能] Tarjan算法的用途之一是,求一个有向图G=(V,E)里极大强连通分量.强连通分量是指有向图G里顶点间能互相到达的子图.而如果一个强连通分量已经没有被其它强通分量完全包含的话,那么这个强连 ...

  5. [转]windows7远程桌面连接失败:发生身份验证错误。要求的函数不受支持

    转至:https://jingyan.baidu.com/article/d169e18604ca86436611d821.html 系统升级后出现远程连接报错,“发生身份验证错误.要求的函数不受支持 ...

  6. IIS将http强转为https(重定向和重写)

    最近接到一个需求,客户希望无论是http还是https请求都可以访问,并且http能转换成https.研究了一圈发现iis的重定向和重写都可以实现http强转https,记录一下. 用到的东东: In ...

  7. Python第二周总结

    之所以晚发10天是因为中途发生了很多事情,让我比较懵,甚至都想放弃学Python,但自己选择的路,在艰难也得走下去,加油!!! 补充上期str后缀小魔法: 字符串一旦创建不得修改,一旦修改或拼接,就会 ...

  8. python 中如何判断list中是否包含某个元素

    在python中可以通过in和not in关键字来判读一个list中是否包含一个元素 theList = ['a','b','c'] if 'a' in theList: print 'a in th ...

  9. CPU制造全过程(图文全解)

          沙子:硅是地壳内第二丰富的元素,而脱氧后的沙子(尤其是石英)最多包含25%的硅元素,以二氧化硅(SiO2)的形式存在,这也是半导体制造产业的基础. 硅熔炼:12英寸/300毫米晶圆级.通过 ...

  10. MySQL 学习笔记(二):数据库更新、视图和数据控制

    基础准备: 在 school 数据库下建立student.course.sc 三个表: create table student( Sno ) primary key, Sname ) unique, ...