【问题标题】:How do I tell Entity (Code First) to not send the Key ID field to the database?如何告诉实体(代码优先)不要将密钥 ID 字段发送到数据库?
【发布时间】:2013-12-19 02:26:22
【问题描述】:

我的代码:

Models.Resource r = new Models.Resource();
r.Name = txtName.Text;
r.ResourceType = resTypes.Find(rt => rt.Name == "Content");

r.ResourceContents.Add(_resourceContent.Find(rc => rc.ID == _resourceContentID));

ctx.Resource.Add(r);
ctx.SaveChanges();

ctx.SaveChanges() 导致错误: 当 IDENTITY_INSERT 设置为 OFF 时,无法为表“资源”中的标识列插入显式值。

查看发送到 SQL 的内容: ADO.NET:执行非查询“INSERT [dbo].[Resources]([ID], [Name], [Description], [IsOnFile], [ContentOwnerAlias]、[ContentOwnerGroup]、[ResourceTypes_ID]) 值(@0、@1、@2、@3、@4、@5、NULL)"

我的 POCO 资源有 ID 作为键:

public partial class Resource
{
  public Resource()
  {
  }

  [Key]
  public int ID { get; set; }

还有我的地图代码:

public class ResourceMap : EntityTypeConfiguration<Resource>
{
  public ResourceMap()
  {
    // Primary Key
    this.HasKey(t => t.ID);

我如何告诉 Entity 不要将 Key ID 字段发送到数据库?

【问题讨论】:

    标签: entity-framework ef-code-first code-first


    【解决方案1】:

    如果您的 PK 是由数据库生成的(例如 identity),您必须在 Map 中进行配置。

    public class ResourceMap : EntityTypeConfiguration<Resource>
    {
       public ResourceMap()
       {
            // Primary Key
            this.HasKey(t => t.ID);
            this.Property(t => t.ID).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
       }
    }
    

    【讨论】:

      【解决方案2】:

      您不需要HasKey(t =&gt; t.ID) Fluent API 映射或[Key] 数据属性,因为按照惯例,EF 将假定名为 ID 的整数字段是键并且是数据库生成的。

      顺便说一句,我建议当您不遵循约定时,您应该选择一种方法或另一种方法 - 否则您会重复自己,并且当您想要更改某些内容时,您需要在两个地方进行更改。

      我不确定为什么数据库中的字段尚未由数据库生成 - 也许当您通过 fluent api 定义字段时,您也必须指定它。我所知道的是,为了使 EF change 成为数据库生成的关键字段,您需要删除该表。

      所以 - 回滚迁移或删除表/数据库,然后删除数据属性,删除流利的映射并重新创建。

      此问题目前在实体框架中“积压”。如果你想投票,你可以在这里投票:Migrations: does not detect changes to DatabaseGeneratedOption

      其他参考资料:

      Identity problem in EF

      Switching Identity On/Off With A Custom Migration Operation

      【讨论】:

        猜你喜欢
        • 2014-01-06
        • 1970-01-01
        • 1970-01-01
        • 2014-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-15
        • 1970-01-01
        相关资源
        最近更新 更多