【问题标题】:How to insert data with foreign key?如何用外键插入数据?
【发布时间】:2021-09-17 11:02:42
【问题描述】:

用外键插入数据最好(我的意思是最快和最简单)的方法是什么?

我的模型:

public class Package
{
    public Int PackId { get; set; }
    // some fields

    // list with other models! 
    public ICollection<Shipment> shipments { get; set; }
}

public class Shipment
{
    Int Id { get; set; }
    // some fields

    [ForeignKey]
    Int PackId { get; set; }
    Package package { get; set; }
}

我需要在一个请求中创建一个Package 和一些Shipments(数据来自表单)。我是这样做的:

[HttpPost]
public void ControllerMethod(MyViewModel form)
{
    transaction
    {
        // empty list,method from 
        var pack_id = _packageRepository(some_fields_here, new List<Shipment>());

        // repo returns id
        var package = _packageRepository.GetSpecific(pack_id);

        var ls_shipments = new List<Shipment>();

        foreach(var x in form.ListOfShipments)
        {
            var ship = _shipRepository.Add(some_fields_here, pack_id, package);
            ls_shipments.Add(ship);
        }

        // replace empty list with list filled in foreach above
        package.shipments = ls_shipments; 

        _context.SaveChanges();
    }
    catch (Exception e)
    {
        // some actions here
    }
}

看起来很奇怪,但我需要一次创建包裹和许多货物。此外,我添加了新的Package,然后从数据库中获取它——这是最简单的方法吗?

【问题讨论】:

    标签: c# entity-framework-core asp.net-core-mvc


    【解决方案1】:

    您不需要为主表和详细表使用单独的存储库。将您的视图模型字段映射到主实体和详细实体并调用主 Add 方法,它只会跟踪子项本身。如果 PackId 是自动编号,那么您不需要做任何事情。如果不是把pkgid的主键赋给出货的外键

    var _Package = new Package();
    // Assign fields of packages from viewmdoel to entity
    foreach(var item in form.shipments)
    {
    var _Shipment = new Shipment();
    //Assign shipment fields from your view models to shipment entity
    _Package.shipments.Add(_Shipment)
    }
    
    using (var dbCtx = new yourDBEntities())
    {
        //add package entity into  entitySet
        dbCtx.Package.Add(_Package);
        //Save whole entity graph to the database
        dbCtx.SaveChanges();
    }
    

    或者你从包中调用你的 repo 方法来添加/保存

    可以看简单教程here

    【讨论】:

    • 他不需要将Shipments 添加到Shipment 表吗? EF 核心是否将它们自动添加到表 Shipment 中?什么是“yourDbEntities”?我几乎有同样的问题。
    • 好的,它对我有用。但 MainModel 中的列表为空。
    • 这是一个单独的问题,您可以使用帮助程序,例如 github.com/saad749/BeginCollectionItemCore
    • 什么是你的DBEntities()?这不是新的背景,对吧?如何创建新对象和哪个类?
    • 我不知道您的存储库只是为了完整性添加了该部分。我认为你的 repo 应该有一个 add 方法,然后你可以忽略它并调用 _packageRepository.Add(_Package);
    猜你喜欢
    • 2021-09-06
    • 2011-07-19
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多