具有可选外键的实体框架表

时间:2014-01-06 13:06:20

标签: entity-framework ef-code-first

首先,我是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 - 我不认为这是因为该字段可以为空

然后,我不确定在那之后会链接哪些方法。

任何帮助将不胜感激。如果在你的答案中,你可以解释为什么我需要这样做,这也是有益的。知道为什么会帮助我(可能还有其他人可能会阅读这个问题)更好地理解过程和关系。

0 个答案:

没有答案