Мои коллекции / модели выглядят нормально после сохранения, но при загрузке объекта я не получаю данные обратно.Что я делаю не так?

StackOverflow https://stackoverflow.com//questions/9689539

Вопрос

Вот мой исходный код для моей модели:

public class User
{
    public User()
    {
        GUID = Guid.NewGuid();
        Account = new Account();
        Location = new Location();
    }

    public long UserID { get; set; }
    public Guid GUID { get; set; }
    public string DisplayName { get; set; }
    public Location Location { get; set; }
    public virtual Account Account { get; set; }
}

public class UserConfiguration : EntityTypeConfiguration<User>
{
    public UserConfiguration()
    {
        HasKey(x => x.UserID);
    }
}

[ComplexType]
public class Location
{
    [MaxLength(2)]
    public string CountryCode { get; set; }
    [MaxLength(2)]
    public string StateCode { get; set; }
    public string City { get; set; }
}

public class Account
{
    public Account()
    {
        if (EmailAddresses == null) EmailAddresses = new Collection<EmailAddress>();
    }

    [ForeignKey("User")]
    public long AccountID { get; set; }

    public ICollection<EmailAddress> EmailAddresses { get; set; }

    public virtual User User { get; set; }
}

public class AccountConfiguration : EntityTypeConfiguration<Account>
{
    public AccountConfiguration()
    {
        HasKey(x => x.AccountID);
        HasMany(x => x.EmailAddresses).WithRequired(x => x.Account);
    }
}

public class EmailAddress
{
    [Key]
    public string Email { get; set; }

    public EmailTypes Type { get; set; }

    public long AccountID { get; set; }
    public virtual Account Account { get; set; }
}

public class EmailAddressConfiguration : EntityTypeConfiguration<EmailAddress>
{
    public EmailAddressConfiguration()
    {
        HasKey(x => x.Email);
        HasRequired(x => x.Account).WithMany(x => x.EmailAddresses).HasForeignKey(x => x.AccountID);
    }
}

И вот мой класс сущностей:

public class MyEntities : DbContext
{
    public MyEntities()
    {
        Database.SetInitializer<MyEntities>(new DropCreateDatabaseAlways<MyEntities>());
    }

    public DbSet<User> Users { get; set; }
    public DbSet<Account> Accounts { get; set; }
    public DbSet<EmailAddress> EmailAddresses { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Configurations.Add(new UserConfiguration());
        modelBuilder.Configurations.Add(new AccountConfiguration());
        modelBuilder.Configurations.Add(new EmailAddressConfiguration());

        base.OnModelCreating(modelBuilder);
    }
}

И, наконец, мой код, который выполняется в тестовом консольном приложении:

static void Main(string[] args)
    {
        var id = CreateUser();

        using (MyEntities db = new MyEntities())
        {
            var a = db.Users.Find(id);
            var b = a.Account.EmailAddresses;
            var c = db.Accounts.Find(id);
            var d = db.EmailAddresses.Where(x => x.Account.AccountID == id).ToList();
        }

    }

    private static long CreateUser()
    {
        using (MyEntities db = new MyEntities())
        {
            var u = new User();
            u.DisplayName = "TEST";

            u.Location.CountryCode = "US";
            u.Location.StateCode = "HI";
            u.Location.City = "Kauai";

            EmailAddress e = new EmailAddress();
            e.Email = DateTime.UtcNow.Ticks + "@microsoft.com";
            e.Type = EmailTypes.Current;

            u.Account.EmailAddresses.Add(e);

            db.Users.Add(u);

            var cnt = db.SaveChanges();
            // Here I get a return of the 4 entities saved, and my model looks correct.

            return u.UserID;
        }
    }

Как только модель была сохранена (CreateUser), я смог перемещаться по модели, и все выглядело идеально.

Проблема возникает, когда я пытаюсь извлечь данные обратно.
Мои переменные:

a - при переходе к электронной почте adderess отображается 0 записей.

b - это тоже показывает 0 записей в коллекции.

c - при переходе к электронной почте adderess отображается 0 записей.

d - здесь я могу получить адреса электронной почты (но не путем навигации по модели)

Это было полезно?

Решение

Ваш тестовый код для доступа к свойствам навигации основан на отложенной загрузке.Но твой Account.EmailAddresses коллекция не помечена как virtual:

public ICollection<EmailAddress> EmailAddresses { get; set; }

Навигационные свойства должны быть virtual (как твой User.Account свойство), чтобы сделать возможной отложенную загрузку.

В качестве дополнительного примечания:Я рекомендую удалить создание экземпляра Account свойство навигации...

Account = new Account();

...из самого User конструктор.Это известный источник неприятностей:

Что могло бы привести к тому, что Entity Framework сохранит незагруженную (но лениво загружаемую) ссылку поверх существующих данных?

Сначала код EF 4.1:Почему EF не устанавливает это свойство навигации?

Создание экземпляра Location это нормально, потому что это сложный тип, а не свойство навигации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top