EF Code First多个0对多

时间:2015-12-18 07:04:02

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

我无法为我的班级添加第二个一对多(我更喜欢零对多)的关系....

我也使用Entity First框架。我还使用了具有4种不同视图的单一模型。 其中2个应该与A类有第二个x-to-many关系,而另外2个应该与B类有一对多的关系。 这是我的课程的样子:

public class Request
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ID { get; set; }
        ... 
        other properties
        ...         
        public virtual ICollection<OrderBasic> Orders { get; set; }
        public virtual ICollection<OrderExtended> ExtendedOrders { get; set; }

    public Request()
    {
        Orders = new List<OrderBasic>();
        ExtendedOrders = new List<OrderExtended>();
    }       
}

public class OrderBasic
{
    public int ID { get; set; }         
    ... 
    specific OrderBasic properties
    ...

    public int RequestRefId { get; set; }

    [ForeignKey("RequestRefId")]
    public virtual Request Request { get; set; }
}

public class OrderExtended
{
    public int ID { get; set; }         
    ... 
    specific OrderExtended properties
    ...
    public int RequestRefId { get; set; }

    [ForeignKey("RequestRefId")]
    public virtual Request Request { get; set; }
}

查看,根据我想要的特定订单类型呈现不同的PartialView。对BasicOrder类型没有问题。

@model RFP_MVC.Models.Request

@using (Html.BeginForm()) 
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <legend>General info:</legend>
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })

    //Request Model properties...


        <table class="table table-striped" id="orderTable">
            <thead>
                <tr>
                    <th>Material</th>
                    <th>Quantity</th>
                    <th>Unit</th>
                    <th></th>
                </tr>
            </thead>
            <tbody id="OrderZone">
                @foreach (var row in Model.ExtendedOrders)
                {
                    Html.RenderPartial("~/Views/Orders/OrderExtendedCreate.cshtml", row);
                }
            </tbody>
        </table>
        <button class="btn btn-sm btn-success" type="button" id="addOrder">Add order</button>

        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </div>
    </div>
}

DbContext类:

namespace RFP_MVC.DAL
{
    public class DatabaseContext : DbContext
    {
        public DbSet<Shipment> shipments { get; set; }
        public DbSet<Request> requests { get; set;  }
        public DbSet<OrderBasic> basicOrders { get; set; }
        public DbSet<OrderExtended> extendedOrders { get; set; }
    }
}

然后我根据一个propery requestType生成4个不同的视图。两个视图具有OrderBasic的集合,另外两个视图应该实现OrderExtended 然后,我使用局部视图来呈现订单模型的属性。 只要我实现OrderBasic集合,我就没有问题。当我添加二阶模型(OrderExtended)时,我收到以下与EF相关的错误:

  

类型&#39; System.ArgumentNullException&#39;的异常发生在EntityFramework.dll中但未在用户代码中处理。附加信息:值不能为空。

当我尝试显示某个视图的索引时出现问题,即使它是完全不相关的模型的索引(在这种情况下为Shipment)。

1 个答案:

答案 0 :(得分:0)

看起来我找到了罪魁祸首。我的模型包含文件上传:

    [DataType(DataType.Upload)]
    public HttpPostedFileBase Attachment { get; set; }

一旦我尝试添加迁移,就会产生以下错误:

Value cannot be null.
Parameter name: entitySet

EF不支持HttpPostedFileBase。我必须添加一个属性,该属性只存储对文件位置的引用,而不是将实际文件存储在我的数据库中。像这样:

 [NotMapped]
 [DataType(DataType.Upload)]
 public HttpPostedFileBase Attachment{ get; set; } //file to pass to controller
 public string FilePath { get; set;  } //reference to file path