Подтвердить что ты не робот

Указанная схема недействительна. Ошибки: связь не была загружена, потому что тип недоступен

Я хочу ссылаться на OrderAddress модель дважды в моей модели Order; один раз как ShippingAddress и один раз как 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; }

}

Свободный 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.Order_ShippingAddress" не было загружено, потому что тип "MyApp.Domain.DAL.OrderAddress" недоступен.

Что я делаю неправильно?

4b9b3361

Ответ 1

Ошибка немного загадочна, поэтому я не уверен, что именно по этой причине вы получаете эту конкретную ошибку, но я знаю, что это приведет к некоторой ошибке, поэтому вы можете начать с исправления:

У вас есть два отношения "один ко многим" к одной и той же модели на одном классе. Это не проблема сама по себе, но вы должны рассматривать их как отдельные. Другими словами, они не могут иметь противоположное отношение Orders, потому что реляционно, нет способа узнать, какие отношения внешнего ключа должны заполнять этот список. Если вы просто измените свое текущее определение API на что-то вроде .WithMany(t => t.Orders_Shipping) и .WithMany(t => t.Orders_Billing), я думаю, что это устранит вашу ошибку.

Ответ 2

Вам нужно изменить свой объект OrderAddress и ваши сопоставления Fluent API на следующее:

OrderAddress:

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

Свободный 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 > , это примерно такая же проблема, как ваша.

Ответ 3

У этой проблемы. Я считаю, что это как-то связано с веб-сервисом. Мое решение состоялось после обновления справочной службы и операции конфигурации. проблема исчезла. надеюсь, что это поможет.

Ответ 4

В моем случае у меня была эта ошибка, потому что я сделал еще один неполный класс с тем же именем, что и класс, сгенерированный инфраструктурой entity. Кроме моего не было случая. Например:

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

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

Ответ 5

Сначала я получил ту же ошибку, что и база данных: "Отношения не были загружены, потому что тип... недоступен". Проблема заключалась в том, что модель в решении устарела. Чтобы устранить проблему:

  • Дважды щелкните файл edmx в разделе "Решение".
  • Щелкните правой кнопкой мыши по нему.
  • Выберите "Обновить модель из базы данных...".
  • Перейдите на вкладку "Обновить".
  • Нажмите кнопку "Готово".

Теперь ваш edmx должен быть обновлен с последними изменениями базы данных.

Ответ 6

Это обычное явление в объектах самоопределения. в этом случае:

1-check, чтобы иметь коллекцию связей ICollection, List,... для каждого отношения.

2-проверить имя коллекций отношений.

3-в коде сначала проверьте свой EntityTypeConfiguration

Ответ 7

У меня есть одно решение здесь! если вы используете EF, выполните следующие действия:

Открыть model.edmx затем щелкните правой кнопкой мыши по нему и обновите модель из базы данных. наконец, создайте приложение и запустите его.