Разъяснение EF6 и POCO

Я пытаюсь понять, как будет работать следующее с использованием EF6 и POCO.

У меня есть следующие классы:

public class User {
    public int Id { get; set; }
    public virtual ICollection<UserLibrary> libraries{ get; set; }
}

public class UserLibrary {
    public int Id { get; set; }
    public DateTime CreationDate { get; set; }
    public ICollection<AbstractLibrary> { get; set; }

    public int UserId { get; set; }
    public virtual User User { get; set; }
}

public abstract class AbstractLibrary
{
    public int Id { get; set; }
    public string Description { get; set; }
    public decimal Price { get; set; }

    public List<LibraryType> LibraryType{ get; set; }

    public enum LibraryType{ }
}

public class LibraryB: AbstractLibrary
{
    public int x { get; set; }
    public new List<LibraryType> LibraryType{ get; set; }

    public enum LibraryType
    {
        LibraryTypeAA,
        LibraryTypeAB,
        LibraryTypeAC
    }
}

public class LibraryB: AbstractLibrary
{
    public String y { get; set; }
    public new List<LibraryType> LibraryType{ get; set; }

    public enum LibraryType
    {
        LibraryTypeBA,
        LibraryTypeBB,
        LibraryTypeBC
    }
}

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

Причина в том, что у User может быть много UserLibrary, а у UserLibrary может быть много конкретных LibraryA, LibraryB (каждая из которых имеет разные свойства, но все имеют LibraryType с разным перечислением).

Мой вопрос: как это переводится в таблицы в EF и как я могу перечислить все «LibraryTypes»?

Надеюсь, мой вопрос достаточно ясен.


person teh0wner    schedule 21.11.2013    source источник
comment
Почему база LibraryType вообще существует? Кажется, это совсем бесполезно.   -  person Tim S.    schedule 22.11.2013
comment
Сколько существует реализаций AbstractLibrary? Насколько гибким вам нужно быть, чтобы поддерживать больше?   -  person Tim S.    schedule 22.11.2013
comment
На данный момент их 3, но я хотел сделать так, чтобы, если бы я захотел добавить больше, это было бы очень просто. Подумайте об этом так: есть класс A, класс B, класс C, каждый из которых имеет свои собственные перечисления (тип библиотеки). Кроме того, каждый из них может иметь или не иметь дополнительные свойства в соответствии с требованиями пользователя.   -  person teh0wner    schedule 22.11.2013
comment
Причина, по которой существует LibraryType, заключается в том, что я не хотел создавать один конкретный класс для каждого типа. Что я мог бы сделать, так это иметь класс с именем LibraryTypeAA, который расширяет LibraryA, который, в свою очередь, расширяет AbstractLibrary. Однако это приведет к кошмару.   -  person teh0wner    schedule 22.11.2013
comment
Однако вы создали одно конкретное перечисление для каждого типа. Перечисление LibraryA.LibraryType и свойство LibraryA.LibraryType никоим образом не связаны с параллельным перечислением и свойством AbstractLibrary. Они совершенно разные, и похожее название только сбивает с толку, насколько я вижу. ((AbstractLibrary)libraryA).LibraryType не содержит значения libraryA.LibraryType.   -  person Tim S.    schedule 22.11.2013
comment
Хм, спасибо, что сообщили мне! Вот почему я задал такой вопрос, поскольку я немного запутался в том, как наследование и т. Д. Работает с EF. Я посмотрю на сообщение, которое вы упомянули выше, но если у вас есть какие-либо учебные пособия, чтобы указать мне путь, который я вам рекомендую, пожалуйста, дайте мне знать!   -  person teh0wner    schedule 22.11.2013


Ответы (1)


Вот диаграмма Sql. введите здесь описание изображения

Вот код, использующий подход Database First:

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Manual changes to this file may cause unexpected behavior in your application.
//     Manual changes to this file will be overwritten if the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

namespace EF6
{
    using System;
    using System.Collections.Generic;

    public partial class Library
    {
        public Library()
        {
            this.LibraryExtensionAs = new HashSet<LibraryExtensionA>();
            this.LibraryExtensionBs = new HashSet<LibraryExtensionB>();
            this.UserLibraries = new HashSet<UserLibrary>();
        }

        public int Id { get; set; }
        public string Description { get; set; }
        public Nullable<decimal> Price { get; set; }
        public Nullable<int> LinkId { get; set; }

        public virtual LibraryTypeLink LibraryTypeLink { get; set; }
        public virtual ICollection<LibraryExtensionA> LibraryExtensionAs { get; set; }
        public virtual ICollection<LibraryExtensionB> LibraryExtensionBs { get; set; }
        public virtual ICollection<UserLibrary> UserLibraries { get; set; }
    }
}
namespace EF6
{
    using System;
    using System.Collections.Generic;

    public partial class LibraryExtensionA
    {
        public int Id { get; set; }
        public Nullable<int> LibraryId { get; set; }
        public Nullable<int> LinkId { get; set; }
        public Nullable<int> x { get; set; }

        public virtual Library Library { get; set; }
        public virtual LibraryTypeLink LibraryTypeLink { get; set; }
    }
}
namespace EF6
{
    using System;
    using System.Collections.Generic;

    public partial class LibraryExtensionB
    {
        public int Id { get; set; }
        public Nullable<int> LibraryId { get; set; }
        public Nullable<int> LinkId { get; set; }
        public string y { get; set; }

        public virtual Library Library { get; set; }
        public virtual LibraryTypeLink LibraryTypeLink { get; set; }
    }
}
namespace EF6
{
    using System;
    using System.Collections.Generic;

    public partial class LibraryType
    {
        public LibraryType()
        {
            this.LibraryTypeLinks = new HashSet<LibraryTypeLink>();
        }

        public int Id { get; set; }
        public string Name { get; set; }

        public virtual ICollection<LibraryTypeLink> LibraryTypeLinks { get; set; }
    }
}
namespace EF6
{
    using System;
    using System.Collections.Generic;

    public partial class LibraryTypeLink
    {
        public LibraryTypeLink()
        {
            this.Libraries = new HashSet<Library>();
            this.LibraryExtensionAs = new HashSet<LibraryExtensionA>();
            this.LibraryExtensionBs = new HashSet<LibraryExtensionB>();
        }

        public int Id { get; set; }
        public Nullable<int> TypeId { get; set; }

        public virtual ICollection<Library> Libraries { get; set; }
        public virtual ICollection<LibraryExtensionA> LibraryExtensionAs { get; set; }
        public virtual ICollection<LibraryExtensionB> LibraryExtensionBs { get; set; }
        public virtual LibraryType LibraryType { get; set; }
    }
}
namespace EF6
{
    using System;
    using System.Collections.Generic;

    public partial class User
    {
        public User()
        {
            this.UserLibraries = new HashSet<UserLibrary>();
        }

        public int Id { get; set; }

        public virtual ICollection<UserLibrary> UserLibraries { get; set; }
    }
}
namespace EF6
{
    using System;
    using System.Collections.Generic;

    public partial class UserLibrary
    {
        public int Id { get; set; }
        public Nullable<int> UserId { get; set; }
        public Nullable<int> LibraryId { get; set; }

        public virtual Library Library { get; set; }
        public virtual User User { get; set; }
    }
}
person Believe2014    schedule 21.05.2014