使用实体框架,如何在两个模型上添加外键以相互引用

时间:2017-05-17 04:36:39

标签: c# asp.net-mvc entity-framework asp.net-mvc-5 entity

我有一个ASP.NET MVC 5 / C#项目。在我的项目中,我有两个模型,RuleMenuItemMenuItem有一个引用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; }
}

但是,当我尝试拉出包含required-rule的菜单项时,我收到以下错误

  

在模型期间检测到一个或多个验证错误   generation:MenuItem_RequiredRule_Target :: Multiplicity无效   在角色'MenuItem_RequiredRule_Target'的关系中   'MenuItem_RequiredRule'。因为Dependent Role属性不是   关键属性,多重性的上界   依赖角色必须是'*'。

我相信这个错误是由于我的模型之间的循环引用。但是,我需要能够以这两种方式访问​​这两个属性。

如何解决此问题?

2 个答案:

答案 0 :(得分:0)

实体框架应该足够聪明,以确定这是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; }
}

答案 1 :(得分:0)

如果您要使用此路线,则必须通过使用[Key,ForeignKey(" PrefixMenuItem")进行装饰,在规则表中的主键和外键中创建公共字符串Id) p>

有关完整示例,请参阅此文章: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; }

}