我有类层次结构如下:
class BaseType
{
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[DataType(DataType.Text)]
[StringLength(100)]
public string CreatedBy { get; set; }
[DataType(DataType.DateTime)]
public DateTime? CreatedDate { get; set; }
....
}
class Group : BaseType
{
public string Name { get; set; }
}
这是上下文的OnModelCreating方法:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MCQGroup>()
.HasKey(t0 => t0.Id)
.Map(m => m.ToTable("groups"))
.HasMany(t1 => t1.Sections)
.WithMany(t2 => t2.Groups)
.Map(m =>
m.MapLeftKey("group_id")
.MapRightKey("section_id")
.ToTable("groups_to_sections"));
...........
}
我没有使用自动表格生成或迁移。相反,我有许多脚本来创建数据库(实际上,我在第一次运行时使用自动生成,之后脚本创建的表包括webdata_ *表)。这是由多个上下文引起的,在这种情况下,表自动生成存在许多问题。
这是SQL脚本:
-- Tables creation
CREATE TABLE [groups]
(
[id] INT NOT NULL IDENTITY(1, 1),
[name] NVARCHAR(300) NOT NULL,
[createdby] NVARCHAR(4000) NULL,
[createddate] DATETIME NULL,
[modifiedby] NVARCHAR(4000) NULL,
[modifieddate] DATETIME NULL
);
GO
......
-- Intitial data population
SET IDENTITY_INSERT [user_profiles] ON;
GO
INSERT INTO [user_profiles] ...........
SET IDENTITY_INSERT [user_profiles] OFF;
GO
INSERT INTO [webpages_Membership] .............
GO
SET IDENTITY_INSERT [webpages_Roles] ON;
GO
INSERT INTO [webpages_Roles] ..............
GO
SET IDENTITY_INSERT [webpages_Roles] OFF;
GO
INSERT INTO [webpages_UsersInRoles] ...........
GO
注意:我没有像EdmMetadata这样的表或类似的东西(它不是在启动时创建的,所以我没有脚本)。我不是EF的大师,我认为Code First方法不需要任何元数据(我是对的吗?)。
注1:当然上下文创建的所有其他类/表=)
注意2:在数据填充期间,我可能是因为IDENTITY做错了吗?所有字符串触摸IDENTITY都在这里。
问题:当我尝试保存组时,我收到异常“元数据集合中不存在具有标识'id'的成员。参数名称:标识”如何修复它?
答案 0 :(得分:5)
我找到了!解决方案很简单:永远不要混合属性方式元数据声明和流畅的api-way。 我刚刚删除了
[Key]
[DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
来自Id声明的并更改了OnModelChanging中的所有模型声明:
modelBuilder.Entity<MCQGroup>()
.HasKey(t0 => t0.Id)
.Map(m => m.ToTable("groups"))
.Property(x => x.Id)
.HasColumnName("id")
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
.IsRequired();
modelBuilder.Entity<MCQGroup>()
.HasMany(t1 => t1.Sections)
.WithMany(t2 => t2.Groups)
.Map(m => m.MapLeftKey("group_id").MapRightKey("section_id").ToTable("groups_to_sections"));