Index created on views do not get scaffolded properly

Đang mở
#39,616 0 bình luận 0 reaction 0 người được giao Xem trên GitHub

Maintainer thường phản hồi trong vòng 2 ngày

Chưa có ai nhận issue này.

Đánh giá

Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức phù hợp với người mới
48/100
Loại issue
Lỗi
Độ rõ ràng
Khá rõ ràng
Mức độ hoạt động
Sôi nổi
Công nghệ
csharp
Lĩnh vực
database

Hướng nghiên cứu

Start with the reported path through RelationalIndexExtensions.GetDatabaseName() and CSharpDbContextGenerator.tt; the issue says view-mapped entities have no table name, so the generated HasIndex call gets a null name despite index metadata retaining it. Trace the existing design-time scaffolding tests for indexes on views and add coverage for the reported materialized-view case. Done means scaffolding preserves the index name and the generated context model loads successfully.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Mô tả

customer-reported
Bug description

@roji @ErikEJ

This is a followup on original issue https://github.com/dotnet/efcore/issues/37345
Since that issue is closed, I couldn't reopen it.

I understand that the Oracle scenario was identified earlier in https://github.com/dotnet/efcore/issues/37345 as a separate issue. We have retested it with an Oracle EF Core 11 development build, and the null-index-name problem still reproduces.

Actual behavior and impact

Applying scaffolding using above table, materialized view, and index on the materialized view, the generated configuration still contains:

modelBuilder.Entity<MatViewDemo1>(entity =>
{
    entity.HasNoKey().ToView("MAT_VIEW_DEMO_1");

    entity.HasIndex(e => e.StringCol1, null);
});

This is not only missing metadata: accessing the generated context's Model throws:

System.ArgumentNullException: Value cannot be null. (Parameter 'name')
   at EntityTypeBuilder<TEntity>.HasIndex(..., String name)
Investigation

Boundary logging shows:

  1. The Oracle provider returns a DatabaseView containing correctly named DatabaseIndex objects and the correct columns.
  2. RelationalScaffoldingModelFactory preserves the name in the EF index metadata: index.Name is non-null.
  3. The materialized-view entity is mapped using ToView(...), with no table mapping.
  4. RelationalIndexExtensions.GetDatabaseName() returns null when GetTableName() is null.
  5. CSharpDbContextGenerator.tt uses index.GetDatabaseName() directly as the named HasIndex argument, resulting in HasIndex(..., null).

This appears to be a gap at the shared relational/design-time code-generation boundary, rather than incorrect Oracle index discovery.

Request

Could you please investigate and fix the scaffolding path so that a index supplied for a view-mapped entity produces valid configuration and preserves its name?

For the example in the https://github.com/dotnet/efcore/issues/37345, the expected configuration would be:

entity.HasIndex(e => e.StringCol1, "MAT_VIEW_DEMO_1_INDEX1");
Your code
Please find the complete scenario in https://github.com/dotnet/efcore/issues/37345
Stack traces

Verbose output

EF Core version

11.0.0

Database provider

No response

Target framework

No response

Operating system

No response

IDE

No response

Ngôn ngữ chính
C#
Star
14.8k
Fork
3.4k
Merge trung bình
3 ngày 18 giờ
Pull request đã merge (30 ngày)
159

Chuẩn bị môi trường

Mở trong Codespaces

Khởi chạy dev container của dự án ngay trên trình duyệt, bằng tài khoản GitHub của bạn.

Bắt đầu từ đâu

  1. Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
  2. Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
  3. Fork repository và làm thay đổi trên một nhánh.
  4. Mở pull request có tham chiếu số hiệu của issue.

Issue khác của dotnet/efcore

Tất cả issue của dotnet/efcore

Issue tương tự

Thêm issue về C#

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.