[英]Using Entity Framework, how can I add a foreign key on two models to reference each other
我有一個ASP.NET MVC 5 / C#項目。 在我的項目中,我有兩個模型, Rule
和MenuItem
。 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.