Пустая коллекция с использованием Entity Framework Code First - PullRequest
3 голосов
/ 01 марта 2011

У меня есть Restaurant объект, который содержит Menu.Menu содержит MenuItems.

С помощью кода Entity Framework. Сначала я создал базу данных и сохранил в ней одну Restaurant, в которой есть только MenuItem.Я проверил базу данных, и MenuItem там.Однако он не загружается при извлечении объекта Restaurant.

Я попытался реализовать атрибут [OnSerializing] для объекта Menu (так как это происходит в приложении WCF), поэтомучто касается "принудительного" загрузки MenuItems, но это не имело никакого эффекта.Я также видел людей, рекомендующих [IncludeAttribute], но этот атрибут существует в двух сборках, ни одна из которых не присутствует на моем компьютере, насколько я могу судить.

Я попытался включить ведение журнала /трассировка для платформы Entity, но пока безуспешно.

В любом случае, вот как я определил мои объекты данных:

[DataContract]
public class MenuItem
{
    [DataMember]
    public int ID { get; set; }

    [DataMember]
    public string Description { get; set; }

    [DataMember]
    public string Price { get; set; }
}

[CollectionDataContract]
public class ListOfMenuItem : List<MenuItem>
{
}

[DataContract]
public class Menu
{
    /// <summary>
    /// Alternate constructor, used during serialization operation.
    /// </summary>
    /// <param name="pContext"></param>
    [OnDeserializing]
    public void OnDeserializing(StreamingContext pContext)
    {
        Init();
    }

    public Menu()
    {
        Init();
    }

    private void Init()
    {
        MenuItems = new ListOfMenuItem();
    }

    [DataMember]
    public int ID { get; set; }

    [DataMember]
    public ListOfMenuItem MenuItems
    {
        get;
        set;
    }
}

[DataContract]
public class Restaurant
{
    /// <summary>
    /// Alternate constructor, used during serialization operation.
    /// </summary>
    /// <param name="pContext"></param>
    [OnDeserializing]
    public void OnDeserializing(StreamingContext pContext)
    {
        Init();
    }

    public Restaurant()
    {
        Init();
    }

    private void Init()
    {
        Hours = new HoursOfOperation();
        Menu = new Menu();
    }

    /// <summary>
    /// Unique name and identifier for a restaurant.
    /// </summary>
    [DataMember(IsRequired = true)]
    [Key]
    public string Name
    {
        get;
        set;
    }

    /// <summary>
    /// What hours is the restaurant open.
    /// </summary>
    [DataMember]
    public HoursOfOperation Hours
    {
        get;
        set;
    }

    /// <summary>
    /// What does the restaurant have to eat and drink.
    /// </summary>
    [DataMember]
    public Menu Menu
    {
        get;
        set;
    }
}

И база данныхконтекст определяется как:

public class RestaurantDirectory : DbContext
{
    public DbSet<Restaurant> Restaurants { get; set; }
}

Ответы [ 2 ]

1 голос
/ 12 мая 2011

Если вы используете Entity Framework 4.1 в WCF, поместите это в конструктор DbContext

this.Configuration.ProxyCreationEnabled = false;

Если вы используете 4.0, используйте ContextOptions.ProxyCreationEnabled = false

0 голосов
/ 06 марта 2011

Если вы используете Код первым для EF Обычно вы помечаете свою коллекцию предметов как виртуальную.

Пример



public class MenuContext : DbContext
{
    public DbSet Menues{ get; set; }
    public DbSet MenuItems { get; set; }
}
public class Menu
{
    [Key]
    [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGenerationOption.Identity)]
    public Guid MenuID { get; set; }
    public virtual ICollection MenuItems { get; set; }
}

public class MenuItem
{
    [Key]
    [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGenerationOption.Identity)]
    public Guid MenuItemID { get; set; }
    public string Name { get; set; }
    public int price { get; set; }
}
...