【问题标题】:EF Help, NotSupportedException: property 'StoreGeneratedPattern' set to 'Computed' are not supported. Use 'Identity' pattern insteadEF 帮助,NotSupportedException:不支持属性“StoreGeneratedPattern”设置为“计算”。改用“身份”模式
【发布时间】:2017-05-20 10:26:24
【问题描述】:

感谢阅读,我正在使用 EntityFramework 并收到此错误消息

NotSupportedException:修改主键的表 列的属性 'StoreGeneratedPattern' 设置为 'Computed' 不是 支持的。请改用“身份”模式。关键列:'itemID'。 表:'DBEntities.Store.Item'。

单击包含此代码的按钮时产生的错误

db.Items.Add(new Item
        {
            name = tbxItemName.Text,
            description = lblDescription.Text,
            date = DateTime.Now
         });

我相信这个错误可能是因为,从 SQL 端,我有这样的事情

CREATE TABLE Item 
(
    sno                     INT IDENTITY,
    itemID as CAST('ITM' + REPLICATE('0', 4-len(sno)) + CAST(sno as VARCHAR) as CHAR(7)) PERSISTED NOT NULL PRIMARY KEY,
    name                    VARCHAR(50)         NOT NULL,
    description             VARCHAR(255),
    date                DATETIME            NOT NULL
);

通常,我只是在 SQL 中插入值

INSERT INTO Item (name, description, date) VALUES ('Car','Volvo','2017-05-20 12:12:12); 

物品类别

public partial class Item
{
    public int sno { get; set; }
    public string itemID { get; set; }
    public string name { get; set; }
    public string description { get; set; }
    public System.DateTime date { get; set; }
}

您认为错误是因为 SQL 方面的原因吗?

【问题讨论】:

  • 您介意将 Item 类添加到问题中吗?
  • @Kokolo 你好,我刚刚添加了物品类,谢谢!
  • 有流畅的配置吗?看,问题出在 EF 映射方面,您展示了 db 表很好,但现在我们需要查看完整的 EF 映射以便告诉您如何解决它。
  • @IvanStoev 嗨,没有任何流畅的配置。谢谢!
  • 仍然缺少一些东西 - 没有任何配置/数据注释我得到不同的错误(“itemId”是必需的)。这段代码是第一个吗?你得到的错误说 itemId 是计算出来的,你是在哪里以及如何配置的?

标签: c# asp.net sql-server entity-framework


【解决方案1】:

如果你想要一个字符串作为键,在 itemID 前面添加这个数据属性: 这告诉 EF 你想要一个字符串作为键。

更重要的是 DatabaseGeneratedOption.None 告诉数据库您将手动插入 Key 值。 (与整数不同,数据库会自动增加 ID)

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string itemID { get; set; }

如果您想要一个干净的模型类(我的首选方式),您可以在您的 CONTEXT 类中使用 fluent API:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Item>()
                .HasKey(t => t.itemId)
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
    base.OnModelCreating(modelBuilder);
}

如果解决了,请告诉我。

编辑3: 我删除了不需要的信息。

如果你想忽略 sno,你应该告诉 EF:

[NotMapped]
public int sno;

我对 HasDatabase.... 方法不好。 您应该首先获得该属性,如下所示:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Item>()
                .HasKey(t => t.itemID)
                .Property(x =>x.itemID)
                .HasDatabaseGeneratedOption(DatabaseGeneratedOption.None);
    base.OnModelCreating(modelBuilder);
}

【讨论】:

  • 您好,感谢您的帮助。我使用了这两种解决方案,但它不起作用。使用第一个 'EntityTypeConfiguration 时出现错误消息,它不包含'HasDatabaseGeneratedOption' 的定义,并且没有扩展方法'HasDatabaseGeneratedOption' 接受类型的第一个参数..' 顺便说一下,PK 是 itemID。我有'sno'的原因是在数据库端,我用它作为一个整数来增加生成像'ITM0001'、'ITM0002'等的PK。我使用了第二种解决方案,并且收到了与第一个相同的错误消息 感谢您的回复!
  • 现在看看。
  • [未映射]的流畅 api:modelBuilder.Entity().Ignore(t => t.sno);
  • 嗨,非常感谢,但仍然收到NotSupportedException: Modifications to tables where a primary k.. 的初始错误:
  • 如果您首先是数据库-> 我想 StoreGeneratedPattern 是要走的路。但是,如果您是代码优先的,并且您现在有一个空数据库,我强烈建议您在每次模型更改时删除并重新创建数据库。因为我开始相信 NotSupportedException 是由于模型更改引起的。你可以在你的上下文类中做到这一点: Database.SetInitializer(new DropCreateDatabaseAlways());
猜你喜欢
  • 1970-01-01
  • 2014-10-09
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 2020-11-11
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多