1

ここに簡単なモデルがあります:

public class Product1
{
   public int Id { get; set; }
   public double Price { get; set; }
   public int CurrencyID  { get; set; }
   public Currency Currency  { get; set; }
}

public class Product2
{
   public int Id { get; set; }
   public double Price { get; set; }
   public int CurrencyID  { get; set; }
   public Currency Currency  { get; set; }
}

public class Currency
{
   public int Id { get; set; }
   public string Name { get; set; }
   public string ISO4217 { get; set; }
   public string Symbol { get; set; }
}

ご覧のとおり、Currencyは2つの異なるエンティティによって使用される単なるリストですが、これを実行しようとすると、複数のカスケードパスが発生する可能性があるため、これは無効であるというエラーが表示されます。

今私はOnModelCreatingでこれをモデル化する方法を理解しようとしています

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<Product1>().HasRequired(p => p.Currency).WithMany().WillCascadeOnDelete(false);
   modelBuilder.Entity<Product2>().HasRequired(p => p.Currency).WithMany().WillCascadeOnDelete(false);
}

しかし、何らかの理由で、製品は正しく作成されていますが、ロードしようとすると、Currencyがnullになります。

このモデリングで何か間違ったことをしているのですか?

ありがとう!

4

2 に答える 2

1

私はそれを理解し、今後の参考のためにここで説明します: 作成されたベースをよく見てから、間違ったフィールドの FK を作成していることに気付きました: P1:ID -> 通貨:ID、正しいフィールドは P1:CurrencyID である必要があります。 -> 通貨:ID

そこで、正しい FK を強制する方法を見つけました。

modelBuilder.Entity<Product1>().HasRequired(p => p.Currency).WithMany().HasForeignKey(p => p.CurrencyId);

そしてそれだけです!

于 2012-05-09T13:17:17.950 に答える
0

次のようにクラスをマップします。

public class Product1Mapping : EntityTypeConfiguration<Product1>
    {
     public Product1Mapping ()
      {
       ToTable("Product1");
       HasKey(p => p.Id);
       HasRequired(p => p.Tag).WithMany().HasForeignKey(t => t.CurrencyID);
      }
    }

  public class Product2Mapping : EntityTypeConfiguration<Product2>
    {
      public Product2Mapping ()
      {
       ToTable("Product2");
       HasKey(p => p.Id);
       HasRequired(p => p.Tag).WithMany().HasForeignKey(t => t.CurrencyID);
       //other properties
      }
    }

OnModelCreating 作成メソッドを次のように変更します。

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Configurations.Add(new AccountMapping());
            // Add other mapping classes
        }

       public DbSet<Product1> Product1{ get; set; }
       public DbSet<Product2> Product2{ get; set; }

詳細については、次のリンクを参照してください。

http://msdn.microsoft.com/en-us/data/jj591617.aspx

http://entityframework.codeplex.com/workitem/1049

于 2014-02-03T21:49:46.853 に答える