0

我有一个产品模型,允许用户为其产品定义自己的自定义字段。这是通过有 3 个表/模型来完成的。Product包含模型的 IEnumerable 枚举的模型CustomProductProperty。每个CustomProductPropertyModel都是模型的外键DataType。该DataType模型是用户定义可用字段的地方。

我遇到的问题是,每次用户创建新产品时,都会创建一组新产品DataType。如何处理数据以使 TheCustomProductProperty指向现有的DataType而不是创建新的?

[Table("Product")]
public class Product
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ProductID { get; set; }
    public int ProductTypeID { get; set; }
    [Display(Name = "Product Name")]
    public string ProductName { get; set; }
    [ForeignKey("ProductTypeID")]
    [Display(Name = "Product Type")]
    public virtual ProductType ProductType { get; set; }
    public virtual ICollection<CustomProductProperty> CustomProperties { get; set; } 
}

[Table("CustomProductProperty")]
public class CustomProductProperty
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CustomPropertyID { get; set; }

    public int CustomDataTypeID { get; set; }
    [ForeignKey("CustomDataTypeID")]
    public CustomDataType DataType { get; set; }

    public int ProductID { get; set; }
    [ForeignKey("ProductID")]
    public virtual Product Product { get; set; }

    public string PropertyValue { get; set; }
}

[Table("CustomDataType")]
public class CustomDataType
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CustomTypeID { get; set; }
    public string PropertyName { get; set; }
    public CustomDataTypes DataType { get; set; }
    public int ModuleID { get; set; }
    [ForeignKey("ModuleID")]
    public Module Module { get; set; }
}

在创建表单中,我包含了一个@Html.HiddenFor()forDataType.CustomTypeID和调试时,它被包含,但是当我添加到我的 dbcontext 时,它会创建一个全新的DataType

if (ModelState.IsValid)
    {
        db.Products.Add(productViewModel.Product);
        db.SaveChanges();
        return RedirectToAction("Index");
    }

编辑:创建产品的形式如下。

<table class="basic_info_tbl">
    <tr>
        <th>@Html.LabelFor(model => model.Product.ProductName):</th>
        <td>@Html.TextBoxFor(model => model.Product.ProductName) </td>
        <th>@Html.LabelFor(model => model.Product.ProductType):</th>
        <td>@Html.DropDownListFor(model => model.Product.ProductTypeID, Model.ProductTypes)</td>
        @Html.EditorFor(model => model.Product.CustomProperties)
    </tr>
</table>

使用编辑器模板:

<tr>
        @Html.HiddenFor(model => model.DataType.CustomTypeID)
    <th>@Model.DataType.PropertyName</th>
    <td>@Html.TextBoxFor(model => model.PropertyValue)</td>
</tr>
4

1 回答 1

2

来自 Lerman & Miller 的书DbContext

添加图的根将导致图中的每个实体都在上下文中注册为新实体。DbSet.Add如果您使用或将State实体的属性更改为 ,则此行为是相同的Added。一旦状态管理器跟踪了所有实体,您就可以按照自己的方式处理图表,为每个实体指定正确的状态。

(我的重点)

因此,对象图中的对象db.Products.Add(productViewModel.Product)也是.CustomDataTypeAdded

之后,Add()您应该遍历对象图

foreach (var dt in productViewModel.Product.CustomProperties
                                   .Select(x => x.DataType).ToList())
{
    Entry(dt).State = EntityState.Unchanged;
}
于 2013-06-18T14:16:28.140 回答