Вопрос

Я разрабатываю часть программного обеспечения, где у меня есть несколько сущностей, таких как:

public class Workspace
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }

        public virtual List<Playground> Playground { get; set; }
        public virtual List<Workspace> Children { get; set; }
        public virtual List<Member> Members { get; set; }

        public virtual Workspace Parent { get; set; }
    }   

public class Playground
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }

        public virtual List<Service> Services { get; set; }

        public virtual Workspace Workspace { get; set; }
    }

public class Service
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public string Description { get; set; }

        public virtual Playground Playground { get; set; }
    }

Это мои объекты EF4 POCO. Я использую шаблон репозитория и следующий интерфейс:

public interface IRepository<T>
{
    void Add(T entity);
    void Delete(T entity);
    IEnumerable<T> Get(Expression<Func<T, bool>> expression);
    IEnumerable<T> Get();
    void Attach(T entity);

    int Save();
}

В репозитории есть внутренний объектContext. У меня есть UnitOfWork, которая содержит экземпляры моих репозиториев и отвечает за сохранение внесенных им изменений.

Я делаю это прямо сейчас?

Я реализую бизнес-логический слой, как это:

public class DomainWorkspaceService : DomainServiceBase
    {

        public DomainWorkspaceService(Workspace workspace)
            : base(UnitOfWorkFactory.GetInstance())
        {
        }

        public void Create(Workspace workspace)
        {
            UoW.GetRepository<Workspace>().Add(workspace);
        }

        public void Delete(Workspace workspace)
        {
            var pservice = new DomainPlaygroundService();
            foreach (var playground in workspace.Playground)
                pservice.Delete(playground);

            foreach (var child in workspace.Children)
                Delete(child);
        }

    }

Теперь я не уверен, что пойду в правильном направлении. Мои покомензатели (будут) ответственны за проверку и позволит мне сделать что-то вроде

SomeWorkspace.Children.Add(new Workspace {...});

Поскольку эти объекты связаны с контекстом, когда я сохраняю их, будут ли изменения в коллекциях также сохранены в базе данных?

Кроме того, я хочу, чтобы мои детские площадки не могут быть созданы без рабочего пространства и услуг без детской площадки. Где я должен создать и удалить их?

Спасибо.

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

Решение

Все идет нормально.

Вы, вероятно, хотите переместить Save Метод выделения репозитория и на единицу работы. В рамках объекта вы должны сохранить все изменения в контексте одновременно; Вы не можете сделать это за тип. Положив его на репозиторий, подразумевает, что будут сохранены только изменения в репозитории, что, вероятно, не правильно.

Возможно, вы захотите реализовать каскад с рабочего пространства на игровую площадку в качестве каскадов базы данных (какая структура объекта будет распознаваться и поддерживать) вместо их вручную.

Да, сохранение изменений в контексте сохранит все отслеживаемые изменения, включая связанные объекты.

Что касается добавления, если вы не выставляете объектContext, то единственный способ, которым кто-то сможет добавить игровую площадку, является взаимосвязью с объектами, которые вы выставляете.

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