实体关系不起作用

时间:2013-05-18 06:37:35

标签: asp.net-mvc entity-framework

 public class Slider_Locale
    {
        [Key]
        public int Slider_LocaleID { get; set; }

        [ForeignKey("Culture")]
        public int CultureID { get; set; }
        public string Slogan { get; set; }


        public virtual Culture Culture { get; set; }
    }

   public class Culture
    {
        [Key]
        public int CultureID { get; set; }
        public string CultureName { get; set; }
        public string DisplayName { get; set; }

        public virtual Slider_Locale slider_Locale { get; set; }
    }

它给出了如下错误:

  

在模型生成期间检测到一个或多个验证错误:

     

System.Data.Edm.EdmAssociationEnd :: Multiplicity在Role中无效   'Slider_Locale_Culture_Source'的关系   'Slider_Locale_Culture'。因为Dependent Role属性不是   关键属性,多重性的上界   依赖角色必须是 * 。

我怎样才能设计这种关系?请帮助我,因为我是mvc和实体的新手。

1 个答案:

答案 0 :(得分:0)

这是首先包裹你的大脑有点棘手的事情之一。问题是您正在尝试设置1:1(或1:0)映射,但模型中没有任何内容可以强制执行这种映射。例如,如果您有多个具有相同Slider_Locale值的CultureID对象,该怎么办?您的应用程序如何知道选择哪一个?

现在,您可能知道这种情况永远不会发生,但实体框架却不会发生,并且它必须谨慎行事,所以它不会让您建立一个无法证明的关系与表结构一致。理想情况下,它可以让你指定除主键之外的唯一约束来解决这个问题,也许有一天会这样做,但是现在最简单的方法是将它改为一对多映射。例如,你可以这样做:

public class Slider_Locale
{
  [Key]
  public int Slider_LocaleID { get; set; }

  [ForeignKey("Culture")]
  public int CultureID { get; set; }
  public string Slogan { get; set; }

  public virtual Culture Culture { get; set; }
}

public class Culture
{
  [Key]
  public int CultureID { get; set; }
  public string CultureName { get; set; }
  public string DisplayName { get; set; }

  // Note that this got changed to ICollection<>
  public virtual ICollection<Slider_Locale> slider_Locales { get; set; }
}

您可以做的另一件事是更改类以便它们共享相同的主键值,但为了做到这一点,您必须使至少一个关系可选。如果您让我知道Slider_Locale.Culture是否为空,或Culture.slider_Locale,或两者兼而有之,我可以举例说明。