• ef core 随记


    EntityTypeConfiguration

        internal class OrderEntityTypeConfiguration : IEntityTypeConfiguration<Order>
        {
            public void Configure(EntityTypeBuilder<Order> builder)
            {            
                builder.ToTable("Orders", OrderingContext.DEFAULT_SCHEMA);//表名
                builder.HasKey(s => s.Id);//主键
                builder.Property(s => s.Id).ForSqlServerUseSequenceHiLo("ordersqu", OrderingContext.DEFAULT_SCHEMA);//主键自增规则
                builder.OwnsOne(s => s.Address);//一对一关系
                builder.Property<DateTime>("OrderDate").IsRequired();
                builder.Property<int?>("BuyerId").IsRequired(false);
                builder.Property<int>("OrderStatusId").IsRequired();
                builder.Property<int?>("PaymentMethodId").IsRequired(false);
                builder.Property<string>("Description").IsRequired(false);
                var nav = builder.Metadata.FindNavigation(nameof(Order.OrderItems));
                nav.SetPropertyAccessMode(PropertyAccessMode.Field);//取值方式
                builder.HasOne<PaymentMethod>()//一对多关系
                    .WithMany()
                    .IsRequired(false)
                    .OnDelete(DeleteBehavior.Restrict);//删除模式
                builder.HasOne<Buyer>()
                    .WithMany()
                    .IsRequired(false)
                    .HasForeignKey("BuyerId");
                builder.HasOne(s => s.OrderStatus)
                    .WithMany()
                    .HasForeignKey("OrderStatusId");
            }
        }

    DeleteBehavior

    DeleteBehavior.Cascade

    • 如果关联实体未被跟踪,主实体的状态标记为删除,执行SaveChage时,在删除主表的数据的同时,通过数据库的行为删除关联表的数据行;
    • 如果关联实体已经被跟踪,将主实体的状态标记为删除时,关联实体的状态也会标记为删除,执行SaveChange时,先删除关联表的数据行,然后再删除主表的数据行;
    • 外键可以设置非空值、也可以设置为可为空值;
    • 关联实体可以不被跟踪。

    DeleteBehavior.SetNull

    • 如果关联实体未被跟踪,主实体的状态标记为删除,执行SaveChage时,在删除主表的数据时,通过数据库的行为将关联表数据行的外键更新为NULL,;
    • 如果关联实体已经被跟踪,将主实体的状态标记为删除时,关联实体的外键会被设置为null,同时将关联实体的状态标记为修改,执行SaveChange时,先更新关联表的数据行 ,然后删除主表的数据行;
    • 因为要将外键更新为NULL,所以外键必须设置为可空字段;
    • 关联实体可以不被跟踪。

    DeleteBehavior.ClientSetNull

    • 数据库不会执行任何行为;
    • 关联实体必须被跟踪,将主实体的状态标记为删除时,关联实体的外键被设置为null,同时将关联实体的状态标记为修改,执行SaveChange时,先更新关联表的数据行,然后删除主表的数据行(此时的行为与DeleteBehavior.SetNull一致);
    • 因为要将外键更新为NULL,所以外键必须设置为可空字段;
    • 关联实体必须被跟踪,否则保存数据时会抛出异常。

    DeleteBehavior.Restrict

    • 框架不执行任何操作,由开发人员决定关联实体的行为,可以将关联实体的状态设置为删除,也可以将关联实体的外键设置为null;
    • 因为要修改关联实体的状态或外键的值,所以关联实体必须被跟踪。
  • 相关阅读:
    常用模块的作业
    一些常用的模块
    软件开发的目录规范

    匿名函数作业
    模块
    算法,面向过程与匿名函数
    生成器表达式作业
    C. Perfect Keyboard
    C. Ehab and Path-etic MEXs
  • 原文地址:https://www.cnblogs.com/Celebrator/p/11377358.html
Copyright © 2020-2023  润新知