在EF中使用现有数据库时,是否需要配置约束,指数,默认值等?

时间:2018-01-09 11:54:34

标签: c# .net entity-framework .net-core entity-framework-core

我通常在纯SQL中定义我的数据库(大部分时间在VS数据库项目中),如果我需要在.NET项目中使用它们,我reverse engineer使用实体框架。

但是如果从现有数据库生成实体和上下文,通常会得到一堆代码,这些代码只是配置我不希望由EF处理的事情,比如Indices。

Entity Framework是否真的需要所有代码才能正常运行?或者只是有人想要使用EF的迁移或其他东西?没有问题的工作所需的最低配置是什么?

一些代码似乎对我来说是不必要的(所有对于EF Core都是如此):

约束和删除行为

entity.HasOne(d => d.Order)
    .WithMany(p => p.OrderPosition)
    .HasForeignKey(d => d.OrderId)
    .OnDelete(DeleteBehavior.ClientSetNull) // ?
    .HasConstraintName("FK_ORDER_ORDERPOSITION"); // ?

默认值和列类型

entity.Property(e => e.CreatedOn)
    .HasColumnType("datetime") // ?
    .HasDefaultValueSql("(getdate())"); // ?

entity.Property(e => e.Price)
    .HasColumnType("decimal(10, 2)"); // ?

指数

entity.HasIndex(e => new { e.ProjectId, e.OrderId }) // ?
    .HasName("UNIQUE_PROJECT_ORDER") // ?
    .IsUnique(); // ?

的MaxLength

entity.Property(e => e.Application)
    .IsRequired()
    .HasMaxLength(60); // ?

价值生成

entity.Property(e => e.Sequence)
    .ValueGeneratedOnAdd(); // ?

entity.Property(e => e.GUID)
    .ValueGeneratedNever(); // ?

2 个答案:

答案 0 :(得分:2)

大部分内容既可以使用,也可以使用。 EF可以在没有这一切的情况下工作,但是你可能会遇到问题或限制。

EF需要ColumnTypes和length来正确绑定参数。 EF需要知道密钥生成策略以获取生成的密钥值。 EF需要了解导航属性和外键属性之间的关系。

我认为EF不会对关系的级联行为做任何事情,但它可能会,或者可能在未来。

EF并不关心索引,但将来可能会注意到唯一索引。 EF Core需要了解外键关系中涉及的所有密钥。

答案 1 :(得分:0)

以下当前未被运行时使用(在迁移之外),并且可以从脚手架代码中安全地删除:

  • 序列
  • 约束名称
  • 非唯一索引
  • 索引过滤器