C# 如何将主键标识列添加到首先生成的模型的实体框架代码中

C# 如何将主键标识列添加到首先生成的模型的实体框架代码中,c#,sql-server,entity-framework,ef-code-first,asmx,C#,Sql Server,Entity Framework,Ef Code First,Asmx,我通过“添加服务引用”向VS2010项目添加了一个web服务(ASMX)。这将在Reference.cs文件中生成代理类。 其中一些类是我在web服务上调用的方法的返回值。 我试图使用EntityFramework4.1“代码优先”将这些类持久化到我的SQLServer数据库中 我遇到的问题是这些类没有定义“键”。因此,当我尝试使用EF保存返回的对象时,会收到错误消息,如“EntityType'MyReturnObject'未定义键。请为此EntityType定义键”以及EntitySet的相应

我通过“添加服务引用”向VS2010项目添加了一个web服务(ASMX)。这将在Reference.cs文件中生成代理类。 其中一些类是我在web服务上调用的方法的返回值。 我试图使用EntityFramework4.1“代码优先”将这些类持久化到我的SQLServer数据库中

我遇到的问题是这些类没有定义“键”。因此,当我尝试使用EF保存返回的对象时,会收到错误消息,如“EntityType'MyReturnObject'未定义键。请为此EntityType定义键”以及EntitySet的相应错误消息

我想做的是为每个类向生成的表中添加一个标识列。我在web上做了一些研究,应该在数据模型的基于DbContext的类上的“OnModelCreating”事件中进行

i、 例如

protected override void OnModelCreating(DbModelBuilder modelbuilder)
{
    modelBuilder.Entity<TheReturnObject>().AddProperty("MyNEWIdentityColumnName")...blah
}
模型创建时受保护的覆盖无效(DbModelBuilder modelbuilder)
{
modelBuilder.Entity().AddProperty(“MyNEWIdentityColumnName”)…等等
}
在哪里。。。blah是任何需要的额外fluent配置信息,以告诉EF使其成为SQLServer数据库中的标识列

Intellisense告诉我实体没有AddProperty方法,所以只要把它当作我表示需要的方法,我知道它不存在

然后,我还希望对象图中的任何直接子对象在保存时将其用作外键引用。这些子对象也有子对象,因此它们也需要自己的标识列,等等

如果这些是我自己的POCO,我可以将相关的属性和属性添加到源代码中的类中,但由于它们是代理,我不认为这样做是一种选择


也许我不是为了树木而看森林,在这里。我非常感谢您在这方面的任何建议。

代码优先是实体框架的一个选项,它可以接受您编写的一些POCO类并为您生成数据库结构

您可以使用DataAnnotations对模型进行注释,例如指定主键。您还可以使用OnModelCreating并通过FluentAPI定义映射

您可以做的是构建WCF服务返回值的POCO版本,然后将WCF代理映射到您的POCO并将其添加到数据库中

无法通过映射定义向POCO动态添加属性。这将意味着对POCO的类定义进行一些更改,而这不是映射的目的

您还可以考虑手工编写WCF代理,而不是使用生成的代码。如果你手写它们,你可以自由控制它们的外观,你可以将Id列添加到你手工制作的“proxy poco”中

看看。

添加服务参考工具生成的每个类都应该是部分类。因此,为每个实体创建自己的部分,并添加类型为
int
的公共
Id
属性。由于命名约定,EF应自动将此属性识别为密钥。此解决方案允许您插入新实体,但不适用于更新或删除,因为在这种情况下,您需要知道
Id
属性的值


EF只能处理在映射类中定义的属性。您不能通过映射添加额外的列(TPH继承中的鉴别器除外)。

所以这个问题没有解决方法?我现在还有一个场景,我正在从现有的POCO类创建一个DB。但换言之,我必须为这些POCO类添加ID才能使该DB工作?@zo0mbie:每个实体都必须有一个唯一的密钥。如果任何其他属性或属性集唯一标识实体,则无需添加ID。