拥有一个期刊对象。 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; }
映射在期刊和公司之间的多对多表中,但正如一开始所述,项目和数据库处于生产阶段。我看到的唯一解决方案是在公司字段之上添加公司列表(多公司)字段。
不知道如何在实体中使用它。
答案 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