2

VS2012(.NET 4.5 および Entity Framework 5)

継承関係を公開すると、コンパイル時エラーが発生しました:

タイプ 'MrTree.SubSubClass' のプロパティ 'InnerString' で Ignore メソッドを使用することはできません。このタイプは、このプロパティがマップされているタイプ 'MrTree.BaseClass' から継承するためです。このプロパティをモデルから除外するには、基本型で NotMappedAttribute または Ignore メソッドを使用します。

コードは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data.Entity;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            MyDbcontext db = new MyDbcontext();
            int i = db.SubSubClasses.Count();
        }
    }

    public class BaseClass
    {
        [NotMapped]
        public string InnerString { get; set; }
    }

    public class SubClass : BaseClass
    {
    }

    public class SubSubClass : SubClass
    {
    }

    public class MyDbcontext : DbContext
    {
        public DbSet<SubSubClass> SubSubClasses { get; set; }
        public DbSet<SubClass> SubClasses { get; set; }

    }
}

何が悪いのか教えていただけますか?

4

3 に答える 3

1

私自身が経験したこの問題の回避策を見つけました。問題の原因についていくつかの補足情報を投稿しましたが、価値がないと感じた自己中心的なオタクによって削除されました. だから、これがこの問題に対する私の答えです - 完全に正しいとは限らないかもしれませんが、私にはうまくいきます。

まず、この問題は、NotMapped 属性を直接使用して抽象クラスを継承しないクラスにのみ影響しますが、元のステートメントに従って、基本クラスから継承する別のクラスから継承するクラスにのみ影響します。

次のクラス設定に似たものを使用すると、次のように機能します。

基本クラス:

public abstract class EntityBase
{
   public virtual int Id { get; set; } // this will be mapped
   public virtual int DoNotMap { get; set; } // this should be ignored   
}

第 1 レベルの継承

public class Contact : EntityBase
{
  public string Name { get; set; }
}

第 2 レベルの継承

public class Employee : Contact
{
  public DateTime StartDate { get; set; }
}

EntityTypeConfiguration から継承する汎用構成クラスを作成します。

public class DataEntityBaseConfiguration<T> 
  : EntityTypeConfiguration<T> where T : EntityBase
{
  public DataEntityBaseConfiguration()
  {
    Ignore(x => x.DoNotMap);
  }
}

EntityBase クラスから直接継承するすべての第 1 レベルの継承の構成クラスを作成します。つまり、次のようになります。

public class ContactConfiguration : DataEntityBaseConfiguration<Contact>
{
   // place any further configuration rules in the constructor
}

回避策: EntityBase から間接的に継承するすべてのクラスは、単に EntityTypeConfiguration から継承する構成クラスを作成します。

public class EmployeeConfiguration : EntityTypeConfiguration<Employee>
{
  // place any further configuration rules in the constructor
}

DataContext の OnModelCreating メソッドで、構成を追加します。

modelBuilder.Configurations.Add(新しい ContactConfiguration()); modelBuilder.Configurations.Add(new EmployeeConfiguration());

このインスタンスで TPT アプローチを想定すると、特殊化されたバージョンの Employee を Contact への FK リレーションを持つ独自のテーブルにマップします。

 modelBuilder.Entity<Contact>().Map<Employee>(m => m.ToTable("Employees"));

これにより、少なくとも私にとっては、「DoNotMap」プロパティのない連絡先テーブルと、「DoNotMap」テーブルのない従業員テーブルが作成され、連絡先への PK/FK 関係が作成されます。従業員構成の EntityBaseConfiguration から継承していませんが、それでも、どういうわけか、Ignore を選択して除外しています。TPH アプローチを採用した場合、1 つの Contact テーブルと Discriminator 列だけになると思います。TPC は明らかに Employee テーブルのすべての Contact プロパティを再作成しますが、DoNotMap プロパティも作成するかどうかはわかりません。時間があればテストします。

要するに、元の質問に戻ると、NotMapped 属性と Ignore の両方でこれが発生する理由がわかりません。EmployeeConfiguration が EntityBaseConfiguration から継承されたときにエラーが発生しました。第一に、そのステートメントでエラーが偽であり、第二に、解決策が非常に単純になったとしても、再び陥りやすいエラーであるため、回避策には熱心ではありません。

この継承の問題に苦しんでいる人の助けになることを願っています。

よろしく

于 2013-01-03T20:52:15.177 に答える
0

と呼ばれるプロパティがInnerStringありますSubSubClassか? サンプルコードには記載されていませんが、それがエラーの意味です。

上記のコードは私にとってはうまくいきましたが、PK を追加する必要がありました。これがコンソール アプリ全体です。

   public class BaseClass
   {
      public int Id { get; set; }
      [NotMapped]
      public string InnerString { get; set; }
   }

   public class SubClass : BaseClass
   {
   }

   public class SubSubClass : SubClass
   {
   }

   public class MyDbcontext : DbContext
   {
      public DbSet<SubSubClass> SubSubClasses { get; set; }
      public DbSet<SubClass> SubClasses { get; set; }
   }

   class Program
   {
      static void Main( string[] args )
      {
         var context = new MyDbcontext();

         context.SubSubClasses.Add(new SubSubClass());
         context.SaveChanges();
      }
   }

そして、それが作成したデータベース:

ここに画像の説明を入力

于 2012-09-11T03:20:39.790 に答える