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

例:

实体类:

    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. [GO]map做函数参数

    package main import "fmt" func test(m map[int]string) { delete(m, ) } func main() { m := m ...

  2. Claims Based Authentication and Token Based Authentication和WIF

    基于声明的认证方式,其最大特性是可传递(一方面是由授信的Issuer,即claims持有方,发送到你的应用上,注意信任是单向的.例如QQ集成登录,登录成功后,QQ会向你的应用发送claims.另一方面 ...

  3. (转)【前端模板之路】一、重构的兄弟说:我才不想看你的代码!把HTML给我交出来!

    原文地址:http://www.cnblogs.com/chyingp/archive/2013/06/30/front-end-tmplate-start.html 写在前面 随着前端领域的发展和社 ...

  4. 分组背包----HDU1712 ACboy needs your help

    很简单的一道分组背包入门问题.不多解释了. #include <iostream> #include <cstdio> #include <cstring> usi ...

  5. Sublime Text 2插件推荐

    必装Package Control 使用Ctrl+`快捷键或者通过View->Show Console菜单打开命令行,粘贴如下代码: import urllib2,os; pf='Package ...

  6. .netcore项目部署IIS问题

    1.一般根据项目安装对应的runtime  下载地址:https://www.microsoft.com/net/download 2.如果出现502错误可以在cmd命令里面运行如下 如果报错,找到对 ...

  7. 1221: Fibonacci数列 [数学]

    1221: Fibonacci数列 [数学] 时间限制: 1 Sec 内存限制: 128 MB 提交: 116 解决: 36 统计 题目描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn- ...

  8. WPF 动态更换模板

    Window x:Class="模板选择器.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml ...

  9. 数据解析之xpath

    一.环境安装 下载lxml pip install lxml 二.使用 XPath 使用路径表达式来选取 XML 文档中的节点或节点集.节点是通过沿着路径 (path) 或者步 (steps) 来选取 ...

  10. 降维之主成分分析法(PCA)

    一.主成分分析法的思想 我们在研究某些问题时,需要处理带有很多变量的数据,比如研究房价的影响因素,需要考虑的变量有物价水平.土地价格.利率.就业率.城市化率等.变量和数据很多,但是可能存在噪音和冗余, ...