简体   繁体   English

Silverlight RIA EF6代码优先SQL脚本生成未知的Discriminator字段

[英]Silverlight RIA EF6 Code First SQL script generates unknown Discriminator field

This scenario is taking place in a complex Silverlight RIA LOB application We are upgrading the application from 这种情况发生在一个复杂的Silverlight RIA LOB应用程序中。

EntityFramework 4 ==> EntityFramework 6
Silverlight RIA ==> Open RIA
Silverlight 4 ==> Silverlight 5
EF Database First ==> EF Code First

We have a Code First EF6 Context class like following 我们有一个代码优先EF6上下文类,如下所示

public DbContext()
     : base("DefaultConnection")
{
   ...
   public DbSet<Parameter> Parameters{ get; set; }
   public DbSet<ParameterType> ParameterTypes { get; set; }
}


[Table("Parameters")]
public  partial class Parameter
{
    [Key]
    public int ParameterId {get;set;}

    [InverseProperty("ParameterType")]
    public int ParameterTypeId {get;set;}

    [ForeignKey("ParameterTypeId")]
    public virtual ParameterType ParameterType { get; set; }

    public int? StoreId {get;set;}

      ...

}

[Table("ParameterTypes")]
public partial class ParameterType 
{
    [Key]
    public global::System.Int32 ParameterTypeId {get;set;}

    public global::System.String ParameterName {get;set;}

    ...

}

Everything compiles and runs well till it hits a statement 一切都会编译并运行良好,直到发出声明

var t = Context.Parameters.ToList();

the exception states 异常状态

"Invalid column name 'Discriminator'." “无效的列名'Discriminator'。”

None of the Table fields has name "Discriminator" When I looked at the generated SQL Query it shows 表字段均没有名称“ Discriminator”。当我查看生成的SQL查询时,它显示

{SELECT 
 CASE WHEN ([Extent1].[Discriminator] = N'Parameter') THEN '0X' WHEN     ([Extent1].[Discriminator] = N'ImportParameters') THEN '0X0X' WHEN ([Extent1].[Discriminator] = N'RecalcParameters') THEN '0X0X0X' WHEN ([Extent1].[Discriminator] = N'RolloverParameters') THEN '0X0X1X' WHEN ([Extent1].[Discriminator] = N'MassChangeParameters') THEN '0X1X' ELSE '0X2X' END AS [C1], 
    [Extent1].[ParameterId] AS [ParameterId], 
    [Extent1].[ParameterTypeId] AS [ParameterTypeId], 
    [Extent1].[StoreId] AS [StoreId], 
    [Extent1].[FiscalYear] AS [FiscalYear], 
    [Extent1].[ParameterEffectiveDate] AS [ParameterEffectiveDate], 
    [Extent1].[ParameterValue] AS [ParameterValue], 
    [Extent1].[UpdatedOn] AS [UpdatedOn], 
    [Extent1].[UpdatedBy] AS [UpdatedBy], 
CASE WHEN ([Extent1].[Discriminator] = N'Parameter') THEN CAST(NULL AS varchar(1)) WHEN ([Extent1].[Discriminator] = N'ImportParameters') THEN [Extent1].[Prompt] WHEN ([Extent1].[Discriminator] = N'RecalcParameters') THEN [Extent1].[Prompt] WHEN ([Extent1].[Discriminator] = N'RolloverParameters') THEN [Extent1].[Prompt] WHEN ([Extent1].[Discriminator] = N'MassChangeParameters') THEN CAST(NULL AS varchar(1)) END AS [C2], 

    ...

I have no idea where the Discriminator is coming from , but on the other hand why it checks it against strings like N'RecalcParameters' N'RolloverParameters' and so on. 我不知道在哪里鉴别是从哪里来的,但另一方面它为何对其进行检查,例如字符串N'RecalcParameters' N'RolloverParameters'等。

Upon further investigation I realized that my Parameter class has another partial declaration like 经过进一步调查,我意识到我的Parameter类还有另一个部分声明,例如

[KnownType(typeof(ImportParameters))]
[KnownType(typeof(RolloverParameters))]
[KnownType(typeof(RecalcParameters))]
[KnownType(typeof(MassChangeParameters))]
[KnownType(typeof(ReforecastParameters))]
public partial class Parameter
{
    ...
}

It helps to resolve complex entities inheritance on the Silverlight client side. 它有助于解决Silverlight客户端上的复杂实体继承。 My Wild guess is that somehow "KnownType" attribute affects the SQL Server script generator in some way. 我的猜测是,“ KnownType”属性以某种方式影响SQL Server脚本生成器。 I searched all over the internet and wasn't able to find any clue that could help me resolving this issue. 我在整个互联网上进行了搜索,但找不到任何可以帮助我解决此问题的线索。

Use This: 用这个:

    public class DbContext: DbContext
{
   public DbContext()
   {
      Configuration.ProxyCreationEnabled = false;
   }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM