簡體   English   中英

沒有聲明外鍵的導航屬性

[英]Navigation Property without Declaring Foreign Key

我的所有模型至少包含兩個關聯。 在ef4中對此進行建模時,我只能通過使用流暢的界面在沒有第二個外鍵屬性的情況下執行此操作。 ForeignKey似乎是正確使用的屬性,除了它需要一個字符串參數。

所以我的問題是,你能擁有一個導航屬性並使用屬性聲明它嗎?

public class User : IAuditable
{
    // other code

    public virtual User Creator { get; set; }

    public virtual User Modifier { get; set; }
}

我相信,不可能僅僅使用數據屬性來定義關系。 問題是EF的映射約定假設CreatorModifier是同一個關系的兩端,但無法確定該關聯的主體和依賴是什么。 據我所知,在支持的屬性列表中,沒有選項可以使用數據注釋定義主體和從屬端。

除此之外,我猜你實際上想要兩個關系 ,兩者都有一個未在模型中公開的結束。 這意味着您的模型在映射約定方面是“非常規的”。 (我認為CreatorModifier之間的關系實際上是無意義的 - 從語義的角度來看。)

因此,在Fluent API中,您需要這樣:

modelBuilder.Entity<User>()
            .HasRequired(u => u.Creator)
            .WithMany();

modelBuilder.Entity<User>()
            .HasRequired(u => u.Modifier)
            .WithMany();

因為User可以是許多其他用戶記錄的創建者或修飾符。 對?

如果你想在沒有Fluent API且只有DataAnnotations的情況下創建這兩個關系,我認為你必須在模型中引入關聯的Many-Ends,如下所示:

public class User
{
    public int UserId { get; set; }

    [InverseProperty("Creator")]
    public virtual ICollection<User> CreatedUsers { get; set; }
    [InverseProperty("Modifier")]
    public virtual ICollection<User> ModifiedUsers { get; set; }

    [Required]
    public virtual User Creator { get; set; }
    [Required]
    public virtual User Modifier { get; set; }
}

我在這里假設需要CreatorModifier ,否則我們可以省略[Required]屬性。

我認為這是一個明顯的例子,使用Fluent API很有意義,並且比修改模型更好,只是為了避免Fluent配置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM