共用方式為


關聯性的對應屬性 (也稱為資料批註)

對應屬性可用來修改或覆寫模型建置慣例所探索的組態。 對應屬性所執行的組態本身可由 中使用的OnModelCreating模型建置 API 覆寫

重要

本檔只涵蓋關聯性組態內容中的對應屬性。 其他對應屬性的使用涵蓋在更廣泛的 模型化文件的相關章節中。

提示

您可以在 MappingAttributes.cs中找到下列程式代碼。

要取得對應屬性的位置

許多對應屬性來自 System.ComponentModel.DataAnnotationsSystem.ComponentModel.DataAnnotations.Schema 命名空間。 這些命名空間中的屬性會包含在所有支援的 .NET 版本中作為基底架構的一部分,因此不需要安裝任何其他 NuGet 套件。 這些對應屬性通常稱為「數據批注」,且由各種架構使用,包括EF Core、EF6、ASP.NET Core MVC 等等。 它們也會用於驗證。

跨許多技術使用數據批注,並同時用於對應和驗證,導致技術之間的語意差異。 針對EF Core 設計的所有新對應屬性現在都專屬於EF Core,藉此保留其語意,並使用簡單明瞭。 這些屬性包含在 Microsoft.EntityFrameworkCore.Abstractions NuGet 套件中。 每當使用主要 Microsoft.EntityFrameworkCore 套件或其中一個相關聯的資料庫提供者套件時,此套件就會包含為相依性。 不過,Abstractions 套件是輕量型套件,可以直接由應用程式程式代碼參考,而不需要引進所有 EF Core 及其相依性。

RequiredAttribute

RequiredAttribute 會套用至 屬性,表示屬性不可為 null。 在關聯性的內容中, [Required] 通常用於外鍵屬性。 這樣做會使外鍵不可為 Null,因此需要關聯性。 例如,使用下列類型時, Post.BlogId 屬性會變成不可為 Null,而且關聯性會變成必要。

public class Blog
{
    public string Id { get; set; }
    public List<Post> Posts { get; } = new();
}

public class Post
{
    public int Id { get; set; }

    [Required]
    public string BlogId { get; set; }

    public Blog Blog { get; init; }
}

注意

使用 C# 可為 Null 的參考型別時, BlogId 這個範例中的 屬性已經不可為 Null,這表示 [Required] 屬性不會有任何影響。

[Required] 放在相依導覽上的效果相同。 也就是說,使外鍵不可為 Null,因此需要關聯性。 例如:

public class Blog
{
    public string Id { get; set; }
    public List<Post> Posts { get; } = new();
}

public class Post
{
    public int Id { get; set; }

    public string BlogId { get; set; }

    [Required]
    public Blog Blog { get; init; }
}

如果在 [Required] 相依導覽上找到 ,且外鍵屬性處於陰影狀態,則會將shadow屬性設為不可為Null,因此需要關聯性。 例如:

public class Blog
{
    public string Id { get; set; }
    public List<Post> Posts { get; } = new();
}

public class Post
{
    public int Id { get; set; }

    [Required]
    public Blog Blog { get; init; }
}

注意

在關聯性的主要流覽端上使用 [Required] 沒有任何作用。

ForeignKeyAttribute

ForeignKeyAttribute 用來將外鍵屬性與其瀏覽連接。 [ForeignKey] 可以放在具有相依導覽名稱的外鍵屬性上。 例如:

public class Blog
{
    public string Id { get; set; }
    public List<Post> Posts { get; } = new();
}

public class Post
{
    public int Id { get; set; }

    [ForeignKey(nameof(Blog))]
    public string BlogKey { get; set; }

    public Blog Blog { get; init; }
}

或者, [ForeignKey] 可以使用屬性名稱作為外鍵,放在相依或主體導覽上。 例如:

public class Blog
{
    public string Id { get; set; }
    public List<Post> Posts { get; } = new();
}

public class Post
{
    public int Id { get; set; }

    public string BlogKey { get; set; }

    [ForeignKey(nameof(BlogKey))]
    public Blog Blog { get; init; }
}

[ForeignKey] 放在導覽上且提供的名稱不符合任何屬性名稱時, 將會建立具有該名稱的陰影屬性 ,以作為外鍵。 例如:

public class Blog
{
    public string Id { get; set; }
    public List<Post> Posts { get; } = new();
}

public class Post
{
    public int Id { get; set; }

    [ForeignKey("BlogKey")]
    public Blog Blog { get; init; }
}

InversePropertyAttribute

InversePropertyAttribute 是用來將導覽與其反向連接。 例如,在下列實體類型中,和 Post之間Blog有兩個關聯性。 如果沒有任何組態, EF 慣例 就無法判斷兩種類型之間的瀏覽應該配對。 新增 [InverseProperty] 至其中一個配對的導覽可解析此模棱兩可,並允許EF建置模型。

public class Blog
{
    public int Id { get; set; }

    [InverseProperty("Blog")]
    public List<Post> Posts { get; } = new();

    public int FeaturedPostId { get; set; }
    public Post FeaturedPost { get; set; }
}

public class Post
{
    public int Id { get; set; }
    public int BlogId { get; set; }

    public Blog Blog { get; init; }
}

重要

[InverseProperty] 只有在相同類型之間有多個關聯性時,才需要。 使用單一關聯性時,會自動配對兩個導覽。

DeleteBehaviorAttribute

根據慣例,EF 會針對選擇性關聯性使用 ClientSetNull DeleteBehavior ,以及 Cascade 必要關聯性的行為。 您可以將 放在 DeleteBehaviorAttribute 關聯性的其中一個導覽上來變更。 例如:

public class Blog
{
    public int Id { get; set; }
    public List<Post> Posts { get; } = new();
}

public class Post
{
    public int Id { get; set; }
    public int BlogId { get; set; }

    [DeleteBehavior(DeleteBehavior.Restrict)]
    public Blog Blog { get; init; }
}

如需串聯行為的詳細資訊,請參閱串聯刪除