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