簡體   English   中英

使用實體框架,如何在兩個模型上添加外鍵以相互引用

[英]Using Entity Framework, how can I add a foreign key on two models to reference each other

我有一個ASP.NET MVC 5 / C#項目。 在我的項目中,我有兩個模型, RuleMenuItem MenuItem有一個引用Rule的外鍵。 Rule有一個引用MenuItem的外鍵。

值得一提的是,我的模型在模型名稱中有一個前綴。 另外,我使用數據庫第一種方法。

我希望能夠使用.Include(...)獲取具有所需規則的MenuItem,並且我希望能夠使用MenuItem獲取規則

這是我的模特

[Table("Rules")]
public class PrefixRule
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public string Id { get; set; }

    [ForeignKey("Item")]
    public int ModuleId { get; set; }
    public string Name { get; set; }

    public virtual PrefixMenuItem Item { get; set; }
}

[Table("MenuItems")]
public class PrefixMenuItem
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public string Id { get; set; }

    [ForeignKey("RequiredRule")]
    public int? RequiredRuleId { get; set; }
    public string Name { get; set; }

    public virtual PrefixRule RequiredRule { get; set; }
}

但是,當我嘗試拉出包含必需規則的菜單項時,我收到以下錯誤

在模型生成期間檢測到一個或多個驗證錯誤:MenuItem_RequiredRule_Target :: Multiplicity在關系'MenuItem_RequiredRule'中的角色'MenuItem_RequiredRule_Target'中無效。 由於“從屬角色”屬性不是關鍵屬性,因此從屬角色的多重性的上限必須為“*”。

我相信這個錯誤是由於我的模型之間的循環引用。 但是,我需要能夠以任何方式訪問這兩個屬性。

我該如何解決這個問題?

實體框架應該足夠聰明,以確定這是1到0/1的關系。 沒有測試,但這應該工作?

public partial class Rule
{
    [Key, ForeignKey("Item")]
    public string ModuleId { get; set; }
    public string Name { get; set; }

    public virtual MenuItem Item { get; set; }
}

public partial class MenuItem
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public string Id { get; set; }

    public string Name { get; set; }

    public virtual Rule RequiredRule { get; set; }
}

如果您要使用此路由,則必須通過使用[Key,ForeignKey(“PrefixMenuItem”)]進行裝飾,在規則表中的主鍵和外鍵中創建公共字符串Id

有關完整示例,請參閱此文章: http//www.entityframeworktutorial.net/code-first/configure-one-to-one-relationship-in-code-first.aspx

更新示例:

public partial class Rule
{

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Key, ForeignKey("Item")]
    public string Id { get; set; }

    [ForeignKey("Module")]
    public int ModuleId { get; set; }
    public string Name { get; set; }

    public virtual MenuItem Item { get; set; }
    public virtual Module Module { get; set; }
}

public partial class MenuItem
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public string Id { get; set; }

    public string Name { get; set; }

    public virtual Rule RequiredRule { get; set; }
}

public partial class Module
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ModuleId { get; set; }

    public string Name { get; set; }

}

暫無
暫無

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

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