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 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...
随机推荐
- [GO]map做函数参数
package main import "fmt" func test(m map[int]string) { delete(m, ) } func main() { m := m ...
- Claims Based Authentication and Token Based Authentication和WIF
基于声明的认证方式,其最大特性是可传递(一方面是由授信的Issuer,即claims持有方,发送到你的应用上,注意信任是单向的.例如QQ集成登录,登录成功后,QQ会向你的应用发送claims.另一方面 ...
- (转)【前端模板之路】一、重构的兄弟说:我才不想看你的代码!把HTML给我交出来!
原文地址:http://www.cnblogs.com/chyingp/archive/2013/06/30/front-end-tmplate-start.html 写在前面 随着前端领域的发展和社 ...
- 分组背包----HDU1712 ACboy needs your help
很简单的一道分组背包入门问题.不多解释了. #include <iostream> #include <cstdio> #include <cstring> usi ...
- Sublime Text 2插件推荐
必装Package Control 使用Ctrl+`快捷键或者通过View->Show Console菜单打开命令行,粘贴如下代码: import urllib2,os; pf='Package ...
- .netcore项目部署IIS问题
1.一般根据项目安装对应的runtime 下载地址:https://www.microsoft.com/net/download 2.如果出现502错误可以在cmd命令里面运行如下 如果报错,找到对 ...
- 1221: Fibonacci数列 [数学]
1221: Fibonacci数列 [数学] 时间限制: 1 Sec 内存限制: 128 MB 提交: 116 解决: 36 统计 题目描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn- ...
- WPF 动态更换模板
Window x:Class="模板选择器.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml ...
- 数据解析之xpath
一.环境安装 下载lxml pip install lxml 二.使用 XPath 使用路径表达式来选取 XML 文档中的节点或节点集.节点是通过沿着路径 (path) 或者步 (steps) 来选取 ...
- 降维之主成分分析法(PCA)
一.主成分分析法的思想 我们在研究某些问题时,需要处理带有很多变量的数据,比如研究房价的影响因素,需要考虑的变量有物价水平.土地价格.利率.就业率.城市化率等.变量和数据很多,但是可能存在噪音和冗余, ...