zoukankan      html  css  js  c++  java
  • 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();


     

  • 相关阅读:
    CSS 引入方式
    css的选择器效率分析
    CSS样式优先级
    JSONP
    javascript跨域的几种方法
    精确获取对象的类型:Object.prototype.toString()
    MooseFS
    使用tmpfs作为缓存加速缓存的文件目录
    nginx auth
    memcached
  • 原文地址:https://www.cnblogs.com/gmcn/p/7118932.html
Copyright © 2011-2022 走看看