首先是实体框架代码。如何将对象类型文件的列表添加到已具有该类型属性的对象

时间:2018-02-27 09:51:22

标签: c# entity-framework ef-code-first

拥有一个期刊对象。 Journal有一个公司字段。

[Required]
[Display(Name = "Company")]
public int CompanyID { get; set; }

[ForeignKey("CompanyID")]
public Company Company { get; set; }

公司有一份期刊清单

  public IList<Journal> Journals { get; set; }

现在项目上线几个月后,有一个期刊的请求可能会分配多个公司

简单的解决方案是将对象字段更改为:

 public IList<Company> Companies { get; set; }

映射在期刊和公司之间的多对多表中,但正如一开始所述,项目和数据库处于生产阶段。我看到的唯一解决方案是在公司字段之上添加公司列表(多公司)字段。

不知道如何在实体中使用它。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用映射表来解决此问题,以规范化您的新需求,从而使两个表之间的关系变为M:M。下面是它在EF中的外观示例。

myMap.keySet().stream().map(k -> k.name()).collect(Collectors.toMap(k, v)

答案 1 :(得分:0)

原来的情况:   - 公司 - 期刊是一对多的关系。   - 每家公司都有零个或多个期刊,   - 每个期刊都属于一个公司

理想情况:   - 公司 - 期刊是一种多对多的关系   - 每家公司都有零个或多个期刊   - 每个期刊都有零个或多个公司。

通常使用联结表完成多对多关系。在实体框架类中,您不需要此联结表。在您的查询中,您将使用ICollections:

class Company
{
    public int Id {get; set;}   // primary key

    // every Company has zero or more Journals
    public virtual ICollection<Journal> Journals {get; set;}

    ... // other properties
}
class Journal
{
    public int Id {get; set;}   // primary key

    // every Journal is used by zero or more Companies
    public virtual ICollection<Company> Companies{get; set;}

    ... // other properties
}

如果要更改现有实体框架配置数据库的配置,则需要实施迁移。 See Entity Framework Code First Migrations

您在迁移过程中必须做的事情:

(1)创建联结表Company_Journals
两个领域:
  (a)int CompanyId,required,公司的外键   (b)int JournalId,必填,期刊的外键

这两个字段的组合将成为主键 见CreateTable

class AddCompanyJournalsTable: DbMigration
{
    public override void Up()
    {
        CreateTable("dbo.Company_Journals",
        c => new
        {
            CompanyId = c.Int(nullable: false, identity: true)
            JournalId = c.Int(nullable: false, identity: true)
        });

CreateTable的返回值是T ableBuilder object,可用于定义主键和外键

.PrimaryKey(t => new {t.CompanyId, t.JournalId})
.ForeignKey("dbo.Companies", t => t.CompanyId, cascadeDelete: false)
.ForeignKey("dbo.Journals", t => t.JournalId, cascadeDelete: false)

(2)对于您在之前版本中拥有的每个期刊,创建一个Company_Journal 指着公司和期刊:

IQueryable<Journal> allJournals = ...
foreach (Journal journal in allJournals)
{
    dbContext.Journals.Add(new Journal()
    {
        JournalId = journal.Id, // or whatever primary key you have in Journal
        CompanyId = journal.CompanyId
    });
}

(3)使用DropColumn

删除Journal.CompanyId