我有一个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; }
}
但是,当我尝试拉出包含required-rule的菜单项时,我收到以下错误
在模型期间检测到一个或多个验证错误 generation:MenuItem_RequiredRule_Target :: Multiplicity无效 在角色'MenuItem_RequiredRule_Target'的关系中 'MenuItem_RequiredRule'。因为Dependent Role属性不是 关键属性,多重性的上界 依赖角色必须是'*'。
我相信这个错误是由于我的模型之间的循环引用。但是,我需要能够以这两种方式访问这两个属性。
如何解决此问题?
答案 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; }
}