首页 > 解决方案 > 如何将数据保存为与 Entity Framework 的一对零或一对一的关系

问题描述

我有两个表,它们的关系为一到零或一,InvoiceSale并且Budget. 一张销售发票可以有Budget(或没有),但每一张都Budget属于一张销售发票。

这是我的InvoiceSale课:

public class InvoiceSale
{
    public int Id { get; set; }        
    public int NumberInvoice { get; set; }
    public DateTime InvoiceSaleDate { get; set; }
    public Budget Budget{ get; set; }
}

这是我的Budget课:

public class Budget
{
    public int Id { get; set; }
    public byte StateId { get; set; }
    public long Total { get; set; }
    public InvoiceSale InvoiceSale { get; set; }
}

这是我对关系的 fluent API 配置:

HasOptional(fv => fv.Budget)
   .WithOptionalDependent(p => p.InvoiceSale)
   .Map(m => m.MapKey("BudgetId")); //I don't have a navigation property for 
    //this

当我从表单发送数据时,我发送BudgetId下拉列表的值,但是当我尝试在 Entity Framework 中保存更改时,BudgetId可选字段总是插入 null。

由于我没有导航属性BudgetId,因此我不知道如何使用实体框架将此值发送到数据库。

这是插入数据的控制器操作:

[HttpPost]
public ActionResult CreateInvoiceSale(InvoiceSale newInvoiceSale)
{
    var invoiceSale = new InvoiceSale
    {                    
        NumberInvoice = newInvoiceSale.NumberInvoice ,
        InvoiceSaleDate = newInvoiceSale.InvoiceSaleDate ,
        // Here I need to pass the BudgetId value, but how can I do it 
        // without a navigation property?
    };

    _context.InvoiceSales.Add(invoiceSale);
    _context.SaveChanges();

    return Json("ok"):
}

标签: c#asp.net-mvcentity-frameworkentity-framework-6ef-fluent-api

解决方案


在 InvoiceSale 实体中添加外键

    public class InvoiceSale
    {
        public int Id { get; set; }
        public int BudgetId { get; set; }
        public int NumberInvoice { get; set; }
        public DateTime InvoiceSaleDate { get; set; }
        public Budget Budget { get; set; }
    }

    [HttpPost]
    public ActionResult CreateInvoiceSale(InvoiceSale newInvoiceSale)
    {
        var invoiceSale = new InvoiceSale
        {
            BudgetId = newInvoiceSale.BudgetId,
            NumberInvoice = newInvoiceSale.NumberInvoice,
            InvoiceSaleDate = newInvoiceSale.InvoiceSaleDate,
            //Here i need to pass the BudgetId value, but how can i do without a 
            //navigation property
        };
        _context.InvoiceSales.Add(invoiceSale);
        _context.SaveChanges();

        return Json("ok"):
    }

需要在 InvoiceSale 表中赋值,使用这一行BudgetId = newInvoiceSale.BudgetId,


推荐阅读