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

时间:2011-11-20 09:01:52

标签: c# sql-server entity-framework ef-code-first asmx

我通过"添加服务参考"将一个Web服务(ASMX)添加到我的VS2010项目中。这将在Reference.cs文件中生成代理类。 其中一些类是我在Web服务上调用的方法的返回值。 我尝试使用Entity Framework 4.1" Code First"将这些类持久化到我的SQL Server数据库。

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

我想要做的是为每个类的生成表添加一个标识列。我已经在网上做过一些研究,而且这样做的地方似乎是在" OnModelCreating"基于我的DbContext类的数据模型的事件。

即。

之类的东西
protected override void OnModelCreating(DbModelBuilder modelbuilder)
{
    modelBuilder.Entity<TheReturnObject>().AddProperty("MyNEWIdentityColumnName")...blah
}

其中...... blah是告诉EF在SQL Server数据库中创建此标识列所需的其他流畅配置信息。

Intellisense告诉我实体没有AddProperty方法所以只是把它作为我表达我需要的方式,我知道它不存在。

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

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

也许我在这里看不到树林。我非常感谢这方面的任何建议。

2 个答案:

答案 0 :(得分:1)

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

EF只能使用映射类中定义的属性。您不能通过映射添加其他列(TPH继承中的鉴别器除外)。

答案 1 :(得分:0)

代码优先是实体框架的一个选项,用于获取您编写的一些POCO类并为您生成数据库结构。

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

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

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

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

查看this article