web-dev-qa-db-ja.com

指定されたスキーマは無効です。エラー:タイプが利用できないため、関係はロードされませんでした

OrderAddressモデルでOrderモデルを参照したいtwice 1回はShippingAddressとして、もう1回はBillingAdressとして。

一方、OrderAddressモデルにはOrderAddressesのリストが必要です。

OrderAddressモデル


public enum AddressType
{
    Billing,
    Shipping,
    Contact
}
public class OrderAddress : BaseModel
{
    public AddressType AddressType { get; set; }
    public bool IsPrimary { get; set; }

    public string Address { get; set; }
    public string CityStateZip { get; set; }
    public string ContactName { get; set; }
    public string PhoneNumber { get; set; }
    public string FaxNumber { get; set; }
    public string EmailAddress { get; set; }

    public virtual ICollection<Order> Orders { get; set; }

    public virtual ApplicationUser User { get; set; }
}

注文モデル


public class Order : BaseModel
{
    public DateTime OrderDate { get; set; }

    public int BillingAddressId { get; set; }
    public virtual OrderAddress BillingAddress { get; set; }

    public int ShippingAddressId { get; set; }
    public virtual OrderAddress ShippingAddress { get; set; }

    public virtual ApplicationUser User { get; set; }

}

Fluent API


protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Order>()
                .HasRequired(m => m.ShippingAddress)
                .WithMany(t => t.Orders)
                .HasForeignKey(m => m.ShippingAddressId)
                .WillCascadeOnDelete(false);

    modelBuilder.Entity<Order>()
                .HasRequired(m => m.BillingAddress)
                .WithMany(t => t.Orders)
                .HasForeignKey(m => m.BillingAddressId)
                .WillCascadeOnDelete(false);
}

Update-Databaseを実行しようとすると、次のエラーが表示されます。

指定されたスキーマは無効です。エラー:タイプ「MyApp.Domain.DAL.OrderAddress」が使用できないため、関係「MyApp.Domain.DAL.Order_ShippingAddress」はロードされませんでした。

私は何を間違えていますか?

29

エラーは少しわかりにくいので、これがあなたがその特定のエラーを受け取っている理由であるかどうかはわかりませんが、それがsomeエラーを引き起こすことはわかっているので、これを修正することから始めることができます:

あるのは、1つのクラスの同じモデルに対する2つの1対多の関係です。それ自体は問題ではありませんが、別々に扱う必要があります。言い換えると、両者はOrdersの逆の関係を持つことはできません。これは、関係的に、どの外部キー関係がそのリストに入力されるべきかを知る方法がないためです。流れるようなAPI定義を.WithMany(t => t.Orders_Shipping).WithMany(t => t.Orders_Billing)のようなものに変更するだけで、エラーは解消されると思います。

43
Chris Pratt

OrderAddressエンティティとFluent APIマッピングを次のように変更する必要があります。

OrderAddress:

public class OrderAddress : BaseModel
{
    ...
    public virtual ICollection<Order> BillingOrders { get; set; }
    public virtual ICollection<Order> ShippingOrders { get; set; }
    ...
}

Fluent API:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    base.OnModelCreating(modelBuilder);

    modelBuilder.Entity<Order>()
                .HasRequired(m => m.ShippingAddress)
                .WithMany(t => t.ShippingOrders)
                .HasForeignKey(m => m.ShippingAddressId)
                .WillCascadeOnDelete(false);

    modelBuilder.Entity<Order>()
                .HasRequired(m => m.BillingAddress)
                .WithMany(t => t.BillingOrders)
                .HasForeignKey(m => m.BillingAddressId)
                .WillCascadeOnDelete(false);
}

これを確認してください SO post 詳細については、あなたと同じ問題です。

4
Stacked

私の場合、エンティティフレームワークによって生成されたクラスと同じ名前の別の部分クラスを作成したため、このエラーが発生しました。私を除いて、ケースは一致しませんでした。例えば:

public partial class Vehicle
{
    public string Name { get; set; }
    public string Make { get; set; }
    ...
}

public partial class VEhicle
{
    public override bool Equals(object obj)
    {
       ...
    }
}
0
user3711223

これは、自己関係エンティティで一般的です。この場合:

1-各リレーションにICollection、List、...リレーションコレクションがあることを確認します。

2-関係コレクションの名前を確認します。

3-inコードを最初に、EntityTypeConfigurationを確認します

0
Ali Mardan

この問題がありました。これはWebサービスと関係があると思います。私の解決策は、サービス参照を更新し、構成操作が行われた後です。問題はなくなりました。お役に立てれば。

0

最初にデータベースを使用して同じエラーが発生しました:「タイプ...が使用できないため、関係がロードされませんでした」。問題は、ソリューションのモデルが古くなっていたことです。問題を修正するには:

  • [ソリューション]の下のedmxファイルをダブルクリックします。
  • それを右クリックします。
  • 「データベースからモデルを更新...」を選択します。
  • [更新]タブをクリックします。
  • [完了]ボタンをクリックします。

これで、edmxが最新のデータベース変更で更新されます。

0
live-love