【问题标题】:Silverlight RIA EF6 Code First SQL script generates unknown Discriminator fieldSilverlight RIA EF6 Code First SQL 脚本生成未知的鉴别器字段
【发布时间】:2015-02-13 14:13:50
【问题描述】:

这个场景发生在一个复杂的 Silverlight RIA LOB 应用程序中 我们正在从

升级应用程序
EntityFramework 4 ==> EntityFramework 6
Silverlight RIA ==> Open RIA
Silverlight 4 ==> Silverlight 5
EF Database First ==> EF Code First

我们有一个 Code First EF6 Context 类,如下所示

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;}

    ...

}

一切都编译并运行良好,直到它遇到一个语句

var t = Context.Parameters.ToList();

异常状态

“列名‘鉴别器’无效。”

所有表格字段都没有名称“鉴别器” 当我查看生成的 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], 

    ...

我不知道鉴别器是从哪里来的,但另一方面,为什么它会根据 N'RecalcParameters' N'RolloverParameters' 等字符串检查它。

经过进一步调查,我意识到我的 Parameter 类 有另一个部分声明,如

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

它有助于解决 Silverlight 客户端上的复杂实体继承问题。 我的猜测是“KnownType”属性以某种方式影响 SQL Server 脚本生成器。 我在整个互联网上进行了搜索,但找不到任何可以帮助我解决此问题的线索。

【问题讨论】:

    标签: c# sql-server entity-framework silverlight ria


    【解决方案1】:

    使用这个:

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

    【讨论】:

    • 这个我试过了,又试了一次。没有任何区别。仍在生成那个奇怪的 SQL 脚本
    猜你喜欢
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多