2012-11-17 82 views
2

我已阅读关于独立关联的文章,从Ladislav。我检查了他在link中提供的信息。该信息是相当有用的,它揭示了一些光。 但是我想模拟我可以访问的现有数据库。它有三个表用户,证书和测验。具有代码第一独立关联或外键关联的EF模型

起初我想到建模作为独立的关联。为什么?我的用户表具有主键UserID和证书表具有PK CertID和列UserID,我可以说是一个外键。就在我认为它是一对多关系时,我意识到Users表中的某个UserID在Certificates表中找不到。但是,证书中的所有用户标识都可以在用户表中找到。

我的问题是我应该使用独立的关联,如果有的话如何实现这一点,我的用户表成为主要类和证书之一的依赖。这样,我可以显示或从我的用户表中获取值,然后从我的asp.net mvc 3应用程序的证书表中读取值。

请更正此代码下面这说明什么,我打算做到我上面说:

public class Certificates 
{ 
    [Key] 
    public Users CertID { get; set; } 
    public int ID { get; set; } 
    public DateTime recvd { get; set; } 
    public int QuizID { get; set; } 


} 

public class Users 
{ 
    public int ID { get; set; } 
    public string LastName { get; set; } 
    public string FirstName { get; set; } 
    public string email { get; set; } 
    public ICollection<Certificates> Certificates { get; set; } 
} 

public class Quiz 
    { 
     public int QuizID { get; set; } 
     public string QuuizName { get; set; } 
     public int VolumeNo { get; set; } 
     public int mark { get; set; } 
     public ICollection<Certificates> Certificates { get; set; } 
    } 

public class cpdContext : DbContext 
{ 
    public DbSet<Certificates> Certificates { get; set; } 
    public DbSet<Users> Users { get; set; } 
    public DbSet<Users> Quiz { get; set; } 

最后我怎么显示的细节与这三个类与能力的信息视图来添加用户标志和测试。测验和证书之间我想要建模的关系是1对多。

回答

2

我的Users表中有主键UserID和Certificates表有PK CertID和一个UserID我可以说是一个外键。就在 我认为它是一对多的关系时,我意识到Users表中的一些UserID 在Certificates表中找不到。但是,可以在用户表中找到证书中的所有用户ID 。

这对于一个一对多的关系,其中User非常正常的本金和Certificate依赖,你必须强制执行的关系的约束。

我不认为这是决定独立或外键关联的参数。据我可以告诉你可以映射一个数据库架构与两种关联类型。数据库模式不应该是决定的驱动因素。 Ladislav的帖子已经链接了所有细节。还有其他百分点,比数据库架构,将指导决定:

  • 架构:对象和关系世界的严格分离,这可能会导致您不希望有一个“外键”财产关系的决定您的对象模型中的工件。这有利于独立的协会。
  • 易用性:在某些情况下,额外的外键属性可以更轻松地处理关系,尤其是更新它们。这一点是针对外键关联的。
  • 性能:在较大型号的某些情况下,EF的外键关联速度更快。

上面的个人观点2提示我在大多数情况下的秤,但正如所说的都是可能的。

映射与外键关联(我省略除了PK,FK和导航性能的所有属性,以保持它的简称):

public class Certificates 
{ 
    [Key] 
    public int CertID { get; set; } 

    [ForeignKey("User")] 
    public int UserID { get; set; } 
    [ForeignKey("Quiz")] 
    public int QuizID { get; set; } 

    public Users User { get; set; } 
    public Quiz Quiz { get; set; } 
} 

public class Users 
{ 
    public int ID { get; set; } 
    public ICollection<Certificates> Certificates { get; set; } 
} 

public class Quiz 
{ 
    public int QuizID { get; set; } 
    public ICollection<Certificates> Certificates { get; set; } 
} 

这是假定两者的关系是必需的,即在数据库FKS不可为空。如果他们是你需要使FK属性为空(int?)。您可以使用Fluent API代替数据注释,与以下示例类似(但不完全相同!)。

映射与独立协会:

public class Certificates 
{ 
    [Key] 
    public int CertID { get; set; } 

    public Users User { get; set; } 
    public Quiz Quiz { get; set; } 
} 

public class Users 
{ 
    public int ID { get; set; } 
    public ICollection<Certificates> Certificates { get; set; } 
} 

public class Quiz 
{ 
    public int QuizID { get; set; } 
    public ICollection<Certificates> Certificates { get; set; } 
} 

public class cpdContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entitiy<Users>() 
      .HasMany(u => u.Certificates) 
      .WithRequired(c => c.User) // or WithOptional 
      .Map(m => m.MapKey("UserID")); //<- DB FK column name 

     modelBuilder.Entitiy<Quiz>() 
      .HasMany(u => u.Certificates) 
      .WithRequired(c => c.Quiz) // or WithOptional 
      .Map(m => m.MapKey("QuizID")); //<- DB FK column name 
    } 
} 

Certificates的导航性能不要求(无论是在第一还是第二个例子),你可以删除它们,如果你不需要他们,只是使用然后使用无参数WithRequired(),并在第一个示例中使用Fluent API。 (Users类中Certificates集合上的[ForeignKey("UserID")]注释可能也适用。)

+0

感谢Slauma。我遵循你的建议,并喜欢我不了解的Fluent API。阅读相关数据时,我可以从证书读取到用户,即从多人到一个,但我无法从用户读取我想要执行的证书的相关信息。 – Sithelo

+0

@Sithelo:我无法从你的评论中发现问题。如果可能的话,请为您的问题创建一个新问题,您可以在其中显示查询以及哪些内容有效,哪些内容无效。 – Slauma