插入具有一对多关系的新实体,而不在两个表中都创建记录

用户名

我正在使用MVC5和EF6 Code First创建Company可以包含许多Contact实体的新实体。但是,只有Company记录正在被写入数据库。

楷模:

public class Company
{
    public virtual int CompanyId { get; set; }

    [Required]
    public virtual string Name { get; set; }

    [Required]
    public virtual Address Address { get; set; }

    [Required]
    public virtual string Phone { get; set; }

    public virtual string Email { get; set; }

    // can have many Contacts
    public virtual IEnumerable<Contact> Contacts { get; set; }
}

public class Contact
{
    public virtual int ContactId { get; set; }

    [Required]
    public virtual string Title { get; set; }

    [Required]
    public virtual string Forename { get; set; }

    [Required]
    public virtual string Surname { get; set; }

    [Required]
    public virtual string Phone { get; set; }

    public virtual string Email { get; set; }

    // belongs to one Company
    public virtual Company Company { get; set; }
}

控制器:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Create_POST([Bind(Include = "CallerType,Name,Address,Phone,Email,Contacts")] CompanyViewModel viewModel)
    {
        if (ModelState.IsValid)
        {
            // tried commented code to make sure it wasn't a problem with my repository and contact records aren't saved to database...

            //var context = new EfDbContext();

            //var company = new Company
            //{
            //    Name = viewModel.Name,
            //    Phone = viewModel.Phone,
            //    Address = viewModel.Address,
            //    Email = viewModel.Email
            //};

            //context.Companies.Add(company);

            //var contact = new Contact
            //{
            //    Company = company,
            //    Title = "mr",
            //    Forename= "f",
            //    Surname = "s",
            //    Phone = "132"
            //};

            //var contact2 = new Contact
            //{
            //    Company = company,
            //    Title = "mr",
            //    Forename = "for",
            //    Surname = "sur",
            //    Phone = "987"
            //};

            //var contacts = new List<Contact> {contact, contact2};

            //company.Contacts = contacts;

            //context.SaveChanges();


            var contacts = viewModel.Contacts.Select(c => new Contact
            {
                Title = c.Title,
                Forename = c.Forename,
                Surname = c.Surname,
                Phone = c.Phone,
                Email = c.Email
            });

            var company = new Company
            {
                Name = viewModel.Name,
                Phone = viewModel.Phone,
                Address = viewModel.Address,
                Email = viewModel.Email,
                Contacts = contacts
            };

            await _companyRepository.CreateAsync(company);

            var redirectUrl = new UrlHelper(Request.RequestContext).Action("Create", "Enquiry", new { id = company.CompanyId, callerType = viewModel.CallerType });
            return Json(new { Url = redirectUrl });
        }

        Response.StatusCode = 400;

        return PartialView("~/Views/Company/_Create.cshtml", viewModel);
    }

仓库:

    public async Task<TEntity> CreateAsync(TEntity entity)
    {
        if (entity == null) throw new ArgumentNullException(nameof(entity));
        DbContext.Set<TEntity>().Add(entity);
        await DbContext.SaveChangesAsync();
        return entity;
    }

我的印象是,DbContext将“知道”由于Contacts填充了它的集合,因此它将创建Contact链接到created的记录Company还是我必须创建一个Contact表,因为这是其中包含外键的表,EF会“知道”创建第Company一个表?

还是有必要先实际使用保存Company实体SaveChanges(),然后将其分配给Contact记录并执行第二个记录SaveChanges()
如果是这种情况,那么我需要使用Database.BeginTransaction()吗?

关于此的任何指导都将是很棒的,因为这是我第一次使用Entity Framework。

格特·阿诺德

Contacts必须是一个ICollectionEF不支持IEnumerable作为导航属性,因为无法向其中添加项目。

这也意味着您应该更改创建的代码contacts

var contacts = viewModel.Contacts.Select(c => new Contact
{
    Title = c.Title,
    Forename = c.Forename,
    Surname = c.Surname,
    Phone = c.Phone,
    Email = c.Email
}).ToList();  // <= ToList() added

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

插入具有一对多关系的新实体,而不在两个表中都创建记录

来自分类Dev

尝试从具有一对多关系的两个表中插入select

来自分类Dev

在Grails中有两个具有一对多关系的实体

来自分类Dev

NSPredicate获取具有两个一对多关系的实体

来自分类Dev

在两个表之间具有2个一对多关系是否可以接受?

来自分类Dev

在两个表之间具有2个一对多关系是否可以接受?

来自分类Dev

查询具有一对多关系的两个表

来自分类Dev

如何合并具有一对多关系的两个表

来自分类Dev

如何使用实体框架代码优先在两个实体之间具有多个一对多关系

来自分类Dev

如何在Android中具有一对一或一对多关系的对象化实体中插入记录

来自分类Dev

如何在Android中具有一对一或一对多关系的对象化实体中插入记录

来自分类Dev

具有一对多关系的 Laravel 插入记录

来自分类Dev

以一对多关系插入新/更新现有记录

来自分类Dev

从具有一对多关系的两个表中获取数据的最佳方法是什么?

来自分类Dev

SQL根据两个原始列之间的一对一或一对多关系创建新列

来自分类Dev

创建具有一对多关系的mysql表

来自分类Dev

合并两个XML文件,这些文件具有一对多关系C#

来自分类Dev

合并两个XML文件,这些文件具有一对多关系C#

来自分类Dev

如何在Rails中合并具有一对多关系的两个模型?

来自分类Dev

JPA:如何保存具有一对一关系的两个实体?

来自分类Dev

如何修复一侧有两个相同类型实体的一对多关系

来自分类Dev

与一个特定实体具有一对多关系的几个实体

来自分类Dev

SQLite-Net Extension两个实体之间的一对一关系和一对多关系

来自分类Dev

实体框架核心:如何在引用同一张表的一个实体中使用两个一对多关系配置模型

来自分类Dev

实体框架核心:如何在一个实体中使用同一表中的两个一对多关系配置模型

来自分类Dev

在具有一对多关系的实体中同时插入数据

来自分类Dev

将表联接到SQL Server中的两个一对多关系表

来自分类Dev

定义具有多对多关系的两个实体之间的关系

来自分类Dev

同一张表中的两个一对多关系

Related 相关文章

  1. 1

    插入具有一对多关系的新实体,而不在两个表中都创建记录

  2. 2

    尝试从具有一对多关系的两个表中插入select

  3. 3

    在Grails中有两个具有一对多关系的实体

  4. 4

    NSPredicate获取具有两个一对多关系的实体

  5. 5

    在两个表之间具有2个一对多关系是否可以接受?

  6. 6

    在两个表之间具有2个一对多关系是否可以接受?

  7. 7

    查询具有一对多关系的两个表

  8. 8

    如何合并具有一对多关系的两个表

  9. 9

    如何使用实体框架代码优先在两个实体之间具有多个一对多关系

  10. 10

    如何在Android中具有一对一或一对多关系的对象化实体中插入记录

  11. 11

    如何在Android中具有一对一或一对多关系的对象化实体中插入记录

  12. 12

    具有一对多关系的 Laravel 插入记录

  13. 13

    以一对多关系插入新/更新现有记录

  14. 14

    从具有一对多关系的两个表中获取数据的最佳方法是什么?

  15. 15

    SQL根据两个原始列之间的一对一或一对多关系创建新列

  16. 16

    创建具有一对多关系的mysql表

  17. 17

    合并两个XML文件,这些文件具有一对多关系C#

  18. 18

    合并两个XML文件,这些文件具有一对多关系C#

  19. 19

    如何在Rails中合并具有一对多关系的两个模型?

  20. 20

    JPA:如何保存具有一对一关系的两个实体?

  21. 21

    如何修复一侧有两个相同类型实体的一对多关系

  22. 22

    与一个特定实体具有一对多关系的几个实体

  23. 23

    SQLite-Net Extension两个实体之间的一对一关系和一对多关系

  24. 24

    实体框架核心:如何在引用同一张表的一个实体中使用两个一对多关系配置模型

  25. 25

    实体框架核心:如何在一个实体中使用同一表中的两个一对多关系配置模型

  26. 26

    在具有一对多关系的实体中同时插入数据

  27. 27

    将表联接到SQL Server中的两个一对多关系表

  28. 28

    定义具有多对多关系的两个实体之间的关系

  29. 29

    同一张表中的两个一对多关系

热门标签

归档