复制'System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedAttribute'属性

时间:2012-06-22 12:27:16

标签: c# entity-framework ria

我正在使用EntityFramework 4.4版,代码优先,我在一个单独的项目(MyApp.DataModel)中创建了我的数据模型。 因为我正在构建Silverlight应用程序,所以我使用的是WCF RIA服务。 ria服务所需的代码位于不同的项目(MyApp.Services)中。该项目引用了MyApp.DataModel。

数据模型的一个例子:

   [Column("Remaining")]
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public virtual decimal? Remaining
    {
       //
    }

当我构建MyApp.Services时,我收到错误

复制'System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedAttribute'属性

实际上,在生成的代码中有两个属性

[System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedAttribute(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Computed)]
[System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedAttribute(System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption.Computed)]

如果我删除DatabaseGenerated,那么在插入时我会收到错误  无法修改“剩余”列,因为它是计算列或是UNION运算符的结果。

知道为什么以及如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

据我所知,此处的文档为http://msdn.microsoft.com/en-us/data/gg193958.aspxKey已默认为DatabaseGeneratedOption.Identity,因此您无需单独添加DatabaseGenerated。

摘自 DatabaseGenerated

下的部分:

  

密钥属性将成为数据库中的标识密钥。那会   与将DatabaseGenerated设置为相同   DatabaseGenerationOption.Identity。如果你不希望它成为一个   身份密钥,您可以将值设置为DatabaseGenerationOption.None。

老实说,我没有对此进行过测试,但是您可以确认在删除[DatabaseGenerated(DatabaseGeneratedOption.Identity)]后,其他属性仍然保留在生成的代码中吗?

答案 1 :(得分:0)

如果您将该属性标记为DatabaseGeneratedOption.Identity,则EF了解这是关键属性。 实际上,如果您没有放置任何属性(Key或DatabaseGeneratedOption.Identity),EF将假定这是id,因为属性以'ID'结尾,并将在数据库中创建自动增量字段。 在许多情况下(与您的一样),DataAnnotations是可选的。 您也不需要将此属性标记为虚拟属性,因为它是基本类型。使用virtual just关联其他类(延迟加载)。