找不到方法HasDatabaseGeneratedOption

时间:2014-05-09 18:05:41

标签: c# asp.net entity-framework asp.net-mvc-4

我已经阅读了与此相关的所有帖子,并且我已经尝试了所有这些但不是结果。

我使用流畅的api将我的模型映射到数据库。但是当我查询我得到这个错误:

Method not found:

 'System.Data.Entity.ModelConfiguration.Configuration.DecimalPropertyConfiguration

System.Data.Entity.ModelConfiguration.Configuration.DecimalPropertyConfiguration.HasDatabaseGeneratedOption(System.Nullable`1<System.ComponentModel.DataAnnotations.Schema.DatabaseGeneratedOption>)'.

我的模型看起来像这样:

ToTable("table_name");
    HasKey(x => x.CounterId)//this property IS NOT NULLABLE
        .Property(x => x.CounterId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
        .HasColumnName("dbCounter_Id")
        .HasPrecision(10, 0)
        .IsRequired();

    Property(x => x.HouseId)
        .HasColumnName("dbHouseId");

    Property(x => x.ApplicationId)
        .HasColumnName("dbApplication_id");

出于某种原因.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)给我这个错误,所以当我退出时:

HasKey(x => x.CounterId)
    .Property(x => x.PageId)
    .HasColumnName("dbCounter_Id")
    .HasPrecision(10, 0)
    .IsRequired();

我得到的不是错误,而是因为我很幸运,当我尝试将记录添加到该表时我得到insert identity exception。我无法添加或退出HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)方法。

重要提示:键CounterId不是类型INTEGER,而是DECIMAL(10,0)。这可能是问题吗?我无法更改列的数据类型,因为生产中有很多应用程序会以最差的方式生效。

希望我能得到任何帮助。

4 个答案:

答案 0 :(得分:3)

你应该这样做

ToTable("table_name");
    HasKey(x => x.CounterId); // you should split HasKey from Property
    Property(x => x.CounterId)
        .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity)
        .HasColumnName("dbCounter_Id")
        .HasPrecision(10, 0)
        .IsRequired();

    Property(x => x.HouseId)
        .HasColumnName("dbHouseId");

    Property(x => x.ApplicationId)
        .HasColumnName("dbApplication_id");

答案 1 :(得分:1)

您应该尝试从所有项目中删除nuget包。然后再添加一次。

我不知道为什么,但它对我有用,即使包装是相同的。

答案 2 :(得分:0)

此错误的原因之一是由于项目的.NET版本不同。例如如果您的EF DbContext类是在.NET v4.5的项目中创建的,并且如果使用它的Web应用程序是.NET v4.0的,则在运行时可能会收到此错误。

理想情况下,它应该在编译时出错。但是,有时Visual Studio可以很好地编译,尤其是对于较旧的“网站”类型的项目。而且,当应用程序实际运行时,即发生错误。

因此,要解决此问题,请确保客户端应用程序(使用EF DbContext类)的.NET框架版本为> =包含DbContext的项目的.NET版本。

答案 3 :(得分:0)

我在使用 EF6 和 ASP.Net 3.1 时遇到了类似的问题。这个答案帮助我朝着正确的方向轻推,但我解决的方法略有不同。我需要做的就是在表所基于的模型类中添加以下内容:

[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Round { get; set; }