我看了一下从独立相关文章拉吉斯拉夫 。 我已经检查了他在此提供的信息链接 。 这些信息是非常有用的,它提供一些线索。 不过,我想我是给我的访问现有的数据库模型。 它有三个表用户,证书和测验。
起初我还以为造型的独立协会。 为什么? 我的用户表有主键的用户ID和认证表有PK CertID和列的用户ID,我可以说是一个外键。 就在我以为它是一个一对多的关系,我意识到,在用户表中的一些用户名未在证书表中找到。 然而,在证书的所有用户名可以在用户表中找到。
我的问题是应该使用独立的协会,如果是如何实现这一点,我的用户表成为主要的类和证书一个依赖。 这是这样,我可以显示或从我的用户表有值,那么在我的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到测验和证书之间有许多。
我的用户表有主键的用户ID和认证表有PK CertID和列的用户ID,我可以说是一个外键。 就在我以为它是一个一对多的关系,我意识到,在用户表中的一些用户名未在证书表中找到。 然而,在证书的所有用户名可以在用户表中找到。
这对于一个一对多的关系,其中相当正常的User
是主体和Certificate
的依赖,你必须强制执行的关系的约束。
我不认为这是一个参数来决定独立或外键关联。 至于我可以告诉你可以映射一个数据库模式与两个关联类型。 数据库模式不应成为决策的驱动因素。 您已链接拉吉斯拉夫帖子中的所有细节解释它。 还有其他百分点,比数据库架构,将指导决定:
- 架构:对象和关系世界的严格分离,这可能会导致您不希望有一个“外键”属性在你的对象模型关系神器的决定。 这正好有利于独立的协会。
- 易用性:额外外键属性使得它更容易与关系的工作,尤其是在更新它们,在某些情况下。 这一点对于外键关联。
- 性能: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?
取而代之的数据注解,你可以用流利的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()
然后,在第一个例子中使用流利的API。 (可能是[ForeignKey("UserID")]
上的注释Certificates
在收集Users
类将正常工作。)
文章来源: EF model with code first independent association or foreign key association