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 = 10,
                    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(1);
            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(1);
            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(1);
            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 == 3);
            db.Tests.Remove(test);

            db.SaveChanges();


 

转载于:https://www.cnblogs.com/gmcn/p/7118932.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值