首先,我是Entity Framework的新手,我正在尝试使用Code-First模型做一个项目,所以请原谅我对可能会变成一个微不足道的问题的无知......
我正在创建一些POCO EF类,我很难弄清楚如何在DbContext
派生类中设置一些关系。
如果我使用SQL设置表,这就是它们的样子(为了清晰和简洁,删除了无关的列:
CREATE TABLE DBO.Application (
ApplicationId NUMERIC(18,0) IDENTITY(1,1) NOT NULL,
MinimumVersionId NUMERIC(18,0),
CurrentVersionId NUMERIC(18,0));
CREATE TABLE DBO.ApplicationVersion (
ApplicationVersionId NUMERIC(18,0) IDENTITY(1,1) NOT NULL,
ApplicationId NUMERIC(18,0) NOT NULL;
ALTER TABLE DBO.Application ADD
PRIMARY KEY (ApplicationId),
CONSTRAINT Application_FK1
FOREIGN KEY (MinimumVersionId)
REFERENCES DBO.ApplicationVersion (ApplicationVersionId),
CONSTRAINT Application_FK2
FOREIGN KEY (CurrentVersionId)
REFERENCES DBO.ApplicationVersion (ApplicationVersionId);
ALTER TABLE DBO.ApplicationVersion ADD
PRIMARY KEY (ApplicationVersionId),
CONSTRAINT ApplicationVersion_FK1
FOREIGN KEY (ApplicationId)
REFERENCES DBO.Application (ApplicationId);
ApplicationModel POCO类的相关部分是(上面显示的Application DB Table):
public class ApplicationModel
{
public long ApplicationId { get; set; }
public virtual ApplicationVersionModel CurrentVersion { get; set; }
public long? CurrentVersionId { get; set; }
public virtual ApplicationVersionModel MinimumVersion { get; set; }
public long? MinimumVersionId { get; set; }
public virtual IList<ApplicationVersionModel> Versions { get; set; }
}
ApplicationVersionM POCO类(上面显示的ApplicationVersion DB表):
public class ApplicationVersionModel
{
public virtual ApplicationModel Application { get; set; }
public long ApplicationId { get; set; }
public long ApplicationVersionId { get; set; }
}
到目前为止,在继承自OnModelCreating
的类的DbContext
方法中,我有这个:
modelBuilder.Entity<ApplicationModel>()
.HasMany<ApplicationVersionModel>(a => a.Versions)
.WithRequired(av => av.Application)
.HasForeignKey(a => a.ApplicationId);
这是为了建立Application和ApplicationVersion之间的一对多关系。
我感到困惑的是如何编写CurrentVersion和MinimumVersion字段的条目。其中每个都包含一个可在ApplicationVersion.ApplicationVersionId(主键)中找到的值。但是,这些字段在数据库中可以为空,因此是可选的。
我迷失在所有选项中:
WithMany
- 我知道这不是它,因为我指的是一条记录
WithOptionalDependant
WithOptionalPrincipal
WithRequired
- 我不认为这是因为该字段可以为空
然后,我不确定在那之后会链接哪些方法。
任何帮助将不胜感激。如果在你的答案中,你可以解释为什么我需要这样做,这也是有益的。知道为什么会帮助我(可能还有其他人可能会阅读这个问题)更好地理解过程和关系。