EF Help,NotSupportedException:不支持将属性“StoreGeneratedPattern”设置为“Computed”。请改用“身份”模式

时间:2017-05-20 10:26:24

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

感谢您阅读,我正在使用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端吗?

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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

如果这解决了,请告诉我。

EDIT3: 我删除了不需要的信息。

如果你想忽略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);
}