与EF代码有很多甚至很多关系

时间:2013-11-20 17:12:14

标签: asp.net-mvc entity-framework many-to-many

我开始使用EF代码第一个模型开发Asp.NET MVC5应用程序,该应用程序应该让知道语言的成员然后将语言链接回知道该语言的成员,这样它就是多对多这种关系。

public class Member 
{
  ...
  public List<Language> Languages { set; get; }

}

public class Language
{
  public in Id {get;set;}
  public string shortName {set;get;}
  public HashSet<Member> mastersOf { get;set; }
}

Q1。这是一种可行的方法吗?我是EF代码的新手,这是一些谷歌搜索后的第一个想法。稍后,将仅搜索具有特定语言的成员。

Q2。如何使语言“不可变”,以便每种语言只有一行?

2 个答案:

答案 0 :(得分:0)

嗯,imho有一些遗漏的东西:

  • 虚拟导航属性(对代理生成很有用)
  • 可枚举导航属性类型的一些一致性,我个人使用ICollection
  • 在语言类的Id属性的in之后的一个t
  • ...

    公共班级成员 {     ...     public virtual ICollection Languages {set;得到; }

    }

    公共课语言 {     public int Id {get; set;}     public string shortName {set; get;}     public virtual ICollection mastersOf {get; set; } }

R1:这是一种可行的方法,但您需要一些配置代码

R2:不确定理解所以我的答案如下:在设置导航属性时,总是(如果可能)使用上下文附加实体。

答案 1 :(得分:0)

一种方法是

public class Member 
{
   ...
   public virtual ICollection<Language> Languages { set; get; }

}

public class Language
{
   public in Id {get;set;}
   public string shortName {set;get;}
   public virtual ICollection<Member> MastersOf { get;set; }
}

更好的方法是使用映射表,映射成员和语言。通过这种方式,您将拥有一个包含每个成员的一个条目的表,并且您将拥有一个表,其中包含每种语言的一个条目。第3个映射表将具有所有组合。

public class Member 
{
   ...
   public virtual ICollection<MemberLanguage> Languages { set; get; }

}

public class Language
{
   public in Id {get;set;}
   public string shortName {set;get;}
   public virtual ICollection<MemberLanguage> MastersOf { get;set; }
}

public class MemberLanguage
{
   public int MemberId {get; set;} 
   public int LanguageId {get; set;}
   public virtual Member Member { set; get; }  //linked to memberid by convention
   public virtual Language Language { set; get; } //linked to languageid by convention
}