建立关系,同时将更多表聚合到一个表中

时间:2019-02-24 20:49:33

标签: c# entity-framework entity-framework-core

我有一个需要解决的问题-我正在为新应用程序开发数据模型。我使用的是第一个.net核心代码。

在我的应用程序中,用户可以创建多个新项目,每个项目的属性几乎没有什么不同。我需要将这些项目“汇总”到一个表中,以便例如在每个项目上添加注释。

因此,Item1AggItemItem2AggItem之间始终存在1:1关系。

AggItem正是这样做的。应该有包含以下内容的复合主键

  1. ItemId,它是Item1Item2表中的主键
  2. ItemType,即string,将区分项目

我已经尝试了很多东西,但是我真的无法正常工作。我真的只是想在此时建立并运行数据模型。

任何帮助表示赞赏!

AggItem表中的数据如下所示:

ID  ItemId  ItemType    Description
1   1       "item1"     "First item from table Item1"
2   2       "item1"     "Second item from table Item1"
3   1       "item2"     "First item from table Item2"
4   2       "item2"     "Second item from table Item2"

应用上下文:

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<AggItem>().HasKey(table => new {
        table.ItemId,
        table.ItemType
    });
}

域类模型:

public class Item1
{
    public int Id { get; set; }
    public string Description { get; set; }
    public string UsedByCompany { get; set; }
    public string Level { get; set; }
    public int AggItemId { get; set; }
    public virtual AggItem AggItem { get; set; }
}

public class Item2
{
    public int Id { get; set; }
    public string Description { get; set; }
    public string Confidentiality { get; set; }
    public string Quantity { get; set; }
    public int AggItemId { get; set; }
    public virtual AggItem AggItem { get; set; }
}

public class AggItem
{

    public int Id { get; set; }
    public string Description { get; set; }
    public int ItemId { get; set; }
    public string ItemType { get; set; }

    public virtual Comments {get; set;}
    public virtual Item1 item1 { get; set; }
    public virtual Item2 item2 { get; set; }
}

Item1创建方法:

[BindProperty]
public Item1 Item1 { get; set; }

public async Task<IActionResult> OnPostAsync()
{
    if (!ModelState.IsValid)
    {
        return Page();
    }

    var aggItem = new AggItem
    {
        item1 = Item1,
        Description = Item1.Description,
        ItemType = "Item1",
        ItemId = Item1.Id
    };

    _context.Add(new Item1
    {
        Description = Item1.Description,
        AggItem = aggItem

    });

    _context.item1.Add(Item1);
    await _context.SaveChangesAsync();
    return RedirectToPage("./Index");
}

1 个答案:

答案 0 :(得分:0)

您应该使用OO继承模型。 Item1,Item2应该从BaseItem继承。 更多信息:https://docs.microsoft.com/en-us/ef/core/modeling/relational/inheritance