【问题标题】:EF incorrectly maps ID propertyEF 错误地映射 ID 属性
【发布时间】:2012-11-23 12:20:42
【问题描述】:

我有两个 EF 模型,其中一个派生自另一个。

public class Party
{
    [Key]
    public Guid Key { get; set; }

    [Required, MaxLength(50)]
    public string Name { get; set; }
}

public class Customer : Party
{

    [Range(1, int.MaxValue)]
    public int ID { get; set; }
}

当我使用这样的隐藏字段将属性放入 EDIT 视图时:

@Html.HiddenFor(model => model.ID)
@Html.HiddenFor(model => model.Key)

两个字段的值相同,但由于 ID 属性不能是 GUID,因此出现验证错误。

<input data-val="true" data-val-number="The field ID must be a number." data-val-range="Feltet ID må være mellom 1 og 2147483647." data-val-range-max="2147483647" data-val-range-min="1" data-val-required="Feltet ID er obligatorisk." id="ID" name="ID" type="hidden" value="3b9ba191-3a3c-47d9-8bb7-48cc552cc6ec" />
<input data-val="true" data-val-required="Feltet Key er obligatorisk." id="Key" name="Key" type="hidden" value="3b9ba191-3a3c-47d9-8bb7-48cc552cc6ec" />

我如何告诉 EF 名为 ID 的属性不是主键(因为我认为 EF 假设了这一点)?

【问题讨论】:

  • 这是因为控制器的url吗?我的路线设置是 {controller}/{action}/{id} 并且我的编辑操作的 url 是:localhost:54907/Customer/Edit/…
  • 如果我将 ID 属性重命名为 CustomerID 并应用 Column 属性来保留数据库结构,我可以确认该字段不再等于 Key 属性。然而,我的问题是,如何在不将其设置为 url 的 id 部分的情况下保留我的 ID 属性。
  • 您能否展示您用于 DbContext 的代码以及您如何映射鉴别器?还有你使用的是哪个版本的 EntityFramework ...

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


【解决方案1】:

由于任何域模型都必须在 EF 中有一个 ID,因此只需在您的客户类中创建另一个属性并用 [Key] 装饰它

public class Customer : Party
{
    [Key]
    public int CustomID { get; set; }

    [Range(1, int.MaxValue)]
    public int ID { get; set; }
}

【讨论】:

  • 不,我不认为这是正确的,因为 Party 有一个 key 属性。我认为问题在于从 url 字符串中为 ID 属性分配了值。
  • 好的,那么您的数据库架构是什么?你有一张供顾客使用的桌子,一张供聚会使用的桌子吗?数据库中的主键是什么?
  • party 类和 customer 类都存储在同一个表中 = Party 有一个名为 Discriminator 的列,告诉 EF 每条记录是哪种类型。我的模型上面显示的主键 = Key.
猜你喜欢
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 2019-06-23
相关资源
最近更新 更多