Minhas coleções / model look bem depois de verão, mas quando o carregamento da entidade eu não obter os dados de volta para fora.O que estou fazendo de errado?

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

Pergunta

Aqui é o meu código-fonte para o meu modelo:

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);
    }
}

E aqui está a minha Entidade de Classe:

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);
    }
}

E, finalmente, o meu código que é executado em um teste de aplicativo de console:

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;
        }
    }

Uma vez que o modelo foi salvo (CreateUser), eu era capaz de navegar o modelo e tudo parecia perfeito.

O problema surge quando eu tento puxar os dados de volta para fora.
Meu variáveis:

a -- a navegar para e-mail adderess mostra 0 registros.

b-isso também mostra 0 registros na coleção.

c -- navegar para e-mail adderess mostra 0 registros.

d-aqui eu posso obter endereços de e-mail (mas não navegando o modelo)

Foi útil?

Solução

O código de teste para acessar as propriedades de navegação depende de carregamento lento.Mas o seu Account.EmailAddresses a coleção não está marcado como virtual:

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

Propriedades de navegação deve ser virtual (como o seu User.Account propriedade), a fim de tornar o carregamento lento possível.

Como uma nota lateral:Eu recomendo para remover a instanciação do Account propriedade de navegação...

Account = new Account();

...a partir do User construtor.Esta é uma fonte conhecida para o problema:

O que faria com que o Entity Framework para salvar uma descarregado (mas preguiçoso carregável) de referência sobre os dados existentes?

EF 4.1 Primeiro Código:Porque é que a EF não definir esta propriedade de navegação?

Instanciando Location é bom porque é um tipo complexo, e não uma propriedade de navegação.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top