1

私は EF 4.3 を使用しており、エンティティに小さな変更を加えていますが、このエラーの一部であるエンティティ クラスはありません。これが突然吐き始めた理由を理解したいと思います。

私のクラス:

  public class Apple: Fruit
  {
      public Color Color{ get; set; }
  }

  public class Fruit: EntityBase
  {
      public int Size{ get; set; }
      public DateTime? DateGrown{ get; set; }
      public User GrownBy{ get; set; }
      public User SoldBy{ get; set; }
  }

 public class EntityBase
 {
      public int Id{ get; set;}
 }

現在「無効な列名 'Discriminator'」をスローしている行:

repository.Apples.Include("GrownBy").Include("SoldBy")
          .Where(r => r.GrownBy.Id == user.Id 
           || r.SoldBy.Id == user.Id).ToList();

repository.Apples が実行しようとしている SQL をコピーし、SSMS で実行すると、問題なく実行されます。

SELECT 
[Extent1].[Id] AS [Id], 
'0X0X' AS [C1], 
[Extent1].[DateGrown] AS [DateGrown], 
[Extent1].[Color] AS [Color], 
[Extent1].[DateGrown] AS [DateGrown], 
[Extent1].[GrownBy_Id] AS [GrownBy_Id], 
[Extent1].[SoldBy_Id] AS [SoldBy_Id], 
[Extent1].[Size] AS [Size], 
FROM [dbo].[Fruits] AS [Extent1]
WHERE [Extent1].[Discriminator] = N'Apple'

[NotMapped] データ注釈を推奨 @ EF Code First として追加しようとしましたが、次のような継承はありません:

    [NotMapped]
    public class Apple: Fruit
    {
       public Color Color{ get; set; }
    }

しかし、それは新しいエラーを作成します:

タイプ「Domain.Entities.Apple」はマップされませんでした。Ignore メソッドまたは NotMappedAttribute データ注釈を使用して、型が明示的に除外されていないことを確認してください。型がクラスとして定義されていること、プリミティブ、ネスト、またはジェネリックではないこと、および EntityObject から継承されていないことを確認してください。

次の行で:

       _context.Database.Initialize(true);

毎週このような新しい問題が発生し続けるため、EF の使用を本当に後悔し始めています。誰かが修正に関する洞察を提供できる場合は、大歓迎です。

編集: つまり、Fruit や Apple のエンティティとはまったく関係がないようです。User エンティティの継承されたクラスを追加しましたが、それが原因で問題が発生しています。

4

2 に答える 2

1

SQL データベースを Code First または C# コードにマッピングする際にエラーがあるようです。

SSMS を介して SQL クエリが正常に機能していると思われる場合は、以下の手順に従ってください。a) プロジェクト ソリューションを開き、[追加]、[新しいアイテム] の順にクリックして、[オンライン] を選択し、検索列に「POCO.」と入力します。

b) 逆 poco をインストールします。最初は、appconfig 接続文字列名が MyDbContext であることを確認してください。c) poco クラスが生成されると、DB が C# コードにマップされていることがわかります。

さて、SQLクエリが正しいので、試してみてください

[your_dbContext].Database.ExecuteSqlCommand(); または [your_dbContext].[TableName].SqlQuery("生の SQL クエリを書きます").ToList();

于 2013-10-17T11:09:21.673 に答える
0

まず、dbContext を表示します。ここで、次のように列をテーブルに手動で追加してみてください。

ALTER TABLE MY_TABLE ADD MY_COLUMN NVARCHAR NULL

UPDATE [MY_TABLE] SET [MY_COLUMN]=0 WHERE [MY_COLUMN] IS NULL

ALTER TABLE MY_TABLE ALTER COLUMN MY_COLUMN NVARCHAR NOT NULL

エンティティフレームワークがそのように追加したと確信しているので、これはnullでない列をテーブルに追加します。また、AutomaticMigrationEnabled を true に設定すると、次のようにそれが行われているはずです (クエリの前に試してみるべきだと思います)。

 internal sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = true;

        }

        protected override void Seed(MyDbContext context)
        {

            //  This method will be called after migrating to the latest version.

            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data. E.g.
            //
            //    context.People.AddOrUpdate(
            //      p => p.FullName,
            //      new Person { FullName = "Andrew Peters" },
            //      new Person { FullName = "Brice Lambson" },
            //      new Person { FullName = "Rowan Miller" }
            //    );
            //
        }
    }

ご覧のとおり、これは移行を有効にしたときに作成される Configuration.cs クラスです。うまくいけば、これが少し役立つでしょう。

于 2014-12-05T18:55:57.653 に答える