1

MessagesWindow私はこのコードを持つ新しいを開きます:

namespace Newsletter.UI
{
    public partial class MessagesWindow : Window
    {
        MessageService msgService;
        public MessagesWindow()
        {
            InitializeComponent();
            msgService = new MessageService();
        }

        private void CreateButtonClick(object sender, RoutedEventArgs e)
        {
            var createMessageWindow = new CreateMessageWindow { Owner = this };
            createMessageWindow.ShowDialog();
            gridMessages.ItemsSource = from msg in msgService.GetAllMessages()
                                       select msg;
        }

        private void messagesWindow_Loaded(object sender, RoutedEventArgs e)
        {          
            gridMessages.ItemsSource = from msg in msgService.GetAllMessages()
                                       select msg;
        }

        private void EditButtonClick(object sender, RoutedEventArgs e)
        {

            if (gridMessages.SelectedItem == null)
                MessageBox.Show("You have to choose the message first.");
            else
            {
                var selectedMessage = (Message)gridMessages.SelectedItem;

                var editMessageWindow = new EditMessageWindow(selectedMessage);
                editMessageWindow.Owner = this;
                editMessageWindow.ShowDialog(); 
            }
            gridMessages.ItemsSource = from msg in msgService.GetAllMessages()
                                        select msg;
        }
    }
}

EditButtonClick編集したい場所で新しいウィンドウを開きますMessageEditMessageWindow:のコード

namespace Newsletter.UI
{
    public partial class EditMessageWindow : Window
    {
        private Message editMessage;
        private MessageService messageService;
        public EditMessageWindow(Message message)
        {
            InitializeComponent();
            editMessage = message;
            messageService = new MessageService();

        }

        private void CreateMessageWindowLoaded(object sender, RoutedEventArgs e)
        {
            subject.Text = editMessage.Subject;
            messageContent.AppendText(editMessage.Content);
            senderComboBox.ItemsSource = messageService.GetAllSenders();

            mailingListComboBox.ItemsSource = messageService.GetAllMailingLists();

        }

        private void SaveClick(object sender, RoutedEventArgs e)
        {            
            editMessage.Date = DateTime.Now;
            editMessage.Content = messageContent.Text;
            editMessage.MailingList.Add(messageService.GetAllMailingLists()[mailingListComboBox.SelectedIndex]); //ERROR
            editMessage.Sender = messageService.GetAllSenders()[senderComboBox.SelectedIndex];
            editMessage.Subject = subject.Text;
            editMessage.HasAttachments = false;
            messageService.EditMessage(editMessage);

            Close();
        }
    }
}

エラーが発生しますSaveClick

2つのオブジェクトは異なるObjectContextオブジェクトにアタッチされているため、2つのオブジェクト間の関係を定義することはできません。

最後に、MessageServiceコード:

namespace Newsletter.Services
{
    public class MessageService
    {
        private NewsletterEntities _context;

        public MessageService()
        {
            _context = new NewsletterEntities();
        }
        public void AddMessage(Message newMessage)
        {
            _context.Messages.AddObject(newMessage);
            _context.SaveChanges();
        }
        public void EditMessage(Message editMessage)
        {
            var messageToChange = (from m in _context.Messages where editMessage.MessageID == m.MessageID select m).FirstOrDefault();
            if (messageToChange != null)
            {
                messageToChange = editMessage;
                _context.SaveChanges();
            }
        }

        public List<Message> GetAllMessages()
        {
            return (from m in _context.Messages select m).ToList();
        } 

        public List<MailingList> GetAllMailingLists()
        {
            var query = from m in _context.MailingLists select m;
            return query.ToList();
        }

        public List<Sender> GetAllSenders()
        {
            var query = from m in _context.Senders select m;
            return query.ToList();
        }

        public void DeleteMessage(Message message)
        {

            List<MailingList> mailingLists = new List<MailingList>();
            foreach(MailingList ml in message.MailingList.ToList())
            {
                ml.Message.Remove(message);
            }
            _context.Messages.DeleteObject(message);
            _context.SaveChanges();
        }
    }
}

私はそれらすべてのレイヤーとコンテキストに混乱しています。どういうわけかメッセージを切り離し、それを使って何かをして添付する必要があることはわかっていますが、どこでどのようにメッセージを添付するかはわかりません。UIレイヤーのサービスレイヤーMessageService、またはすべてのエンティティがあるDALレイヤーでそれを行う必要がありますか?または、ソリューションを再設計して、コンテキストロジックを別の場所で実行する必要がありますか?

4

1 に答える 1

1

ウィンドウごとにコンテキストが設定されているように見えます。これは、コンテキスト内でオブジェクトを維持する方法に2つの影響を及ぼします。

  1. フォームからフォームにオブジェクトを渡したくない。代わりに、フォームからフォームにIDを渡し、コンテキスト内でエンティティをロードします。
  2. エンティティが1つのコンテキスト内で更新されると、他のウィンドウ/コンテキストに変更を通知して、データを更新できるようにする必要があります。

これは、フォームごとのコンテキストのプロセスを詳しく説明しているMSDNの記事です。この記事ではNHibernateを使用していますが、プロセスはEFとDbCotextでほぼ同じです。

http://msdn.microsoft.com/en-us/magazine/ee819139.aspx

于 2012-11-10T21:35:25.177 に答える