DomainContext, Silverlight 3, код позади, Изменить EntitySet
Я пытаюсь обернуть свой мозг вокруг Silverlight RIA
Я дошел до того, что смогу создать объект с набором объектов, который также имеет набор объектов.
Тестовый объект, содержащий тестовые вопросы, который содержит ответы на вопросы.
У меня установлены ассоциации и данные поступают в приложение Silverlight.
Так что в моем загруженном обратном вызове.... я могу видеть все данные в
private void TestLoaded(LoadOperation lo)
{
var ce =dc.Tests.CanEdit;
dc.Tests.ToList()[0].TestQuestions.ToList()[0].StudentAnswerID = 2;
}
var ce =dc.Tests.CanEdit; //CanEdit = true
но следующая строка выдает ошибку: этот EntitySet типа "SilverlightApplication2.Web.Question" не поддерживает операцию "Edit".
Поэтому мой вопрос: почему CanEdit = true? И что является более изящным способом установки значения в коде?
остальной код.....
public class Test
{
private List<Question> _testQuestions = new List<Question>();
[Key]
public int TestID { get; set; }
public string TestName { get; set; }
[Include]
[Association("Assoc1", "TestID", "TestID,QuestionID")]
public List<Question> TestQuestions
{
get { return _testQuestions; }
set { _testQuestions = value; }
}
}
public class Question
{
private List<Answer> _questionAnswers = new List<Answer>();
[Key]
public int TestID { get; set; }
[Key]
public int QuestionID { get; set; }
public string QuestionText { get; set; }
public int CorrectAnswerID { get; set; }
public int StudentAnswerID { get; set; }
[Include]
[Association("Assoc2", "QuestionID", "QuestionID,AnswerID")]
public List<Answer> QuestionAnswers
{
get { return _questionAnswers; }
set { _questionAnswers = value; }
}
}
public class Answer
{
[Key]
public int QuestionID { get; set; }
[Key]
public int AnswerID { get; set; }
public string AnswerText { get; set; }
}
// Популяция данных
public class TestBuilder
{
public List<Test> MakeATest()
{
var ret = new List<Test>();
var t = new Test()
{
TestID = 1,
TestName = "The Test",
};
var tq = new Question() { TestID = 1, QuestionID = 1, CorrectAnswerID=1, QuestionText = "T1Q1" };
var a = new Answer() { QuestionID = 1, AnswerID = 1, AnswerText = "T1Q1A1" };
tq.QuestionAnswers.Add(a);
a = new Answer() { QuestionID = 1, AnswerID = 2, AnswerText = "T1Q1A2" };
tq.QuestionAnswers.Add(a);
a = new Answer() { QuestionID = 1, AnswerID = 3, AnswerText = "T1Q1A3" };
tq.QuestionAnswers.Add(a);
a = new Answer() { QuestionID = 1, AnswerID = 4, AnswerText = "T1Q1A4" };
tq.QuestionAnswers.Add(a);
t.TestQuestions.Add(tq);
//second question
tq = new Question() { TestID = 1, QuestionID = 2, CorrectAnswerID = 3, QuestionText = "T1Q2" };
a = new Answer() { QuestionID = 2, AnswerID = 1, AnswerText = "T1Q2A1" };
tq.QuestionAnswers.Add(a);
a = new Answer() { QuestionID = 2, AnswerID = 2, AnswerText = "T1Q2A2" };
tq.QuestionAnswers.Add(a);
a = new Answer() { QuestionID = 2, AnswerID = 3, AnswerText = "T1Q2A3" };
tq.QuestionAnswers.Add(a);
a = new Answer() { QuestionID = 2, AnswerID = 4, AnswerText = "T1Q2A4" };
tq.QuestionAnswers.Add(a);
t.TestQuestions.Add(tq);
//third question
tq = new Question() { TestID = 1, QuestionID =3, CorrectAnswerID = 4, QuestionText = "T1Q3" };
a = new Answer() { QuestionID = 3, AnswerID = 1, AnswerText = "T1Q3A1" };
tq.QuestionAnswers.Add(a);
a = new Answer() { QuestionID = 3, AnswerID = 2, AnswerText = "T1Q3A2" };
tq.QuestionAnswers.Add(a);
a = new Answer() { QuestionID = 3, AnswerID = 3, AnswerText = "T1Q3A3" };
tq.QuestionAnswers.Add(a);
a = new Answer() { QuestionID = 3, AnswerID = 4, AnswerText = "T1Q3A4" };
tq.QuestionAnswers.Add(a);
t.TestQuestions.Add(tq);
ret.Add(t);
return ret;
}
}
Доменная служба.....
[EnableClientAccess()]
public class TestDomainService : DomainService
{
public IEnumerable<Test> GetTest()
{
var tb = new TestBuilder();
return tb.MakeATest();
}
public void InsertTest(Test currentData)
{}
public void UpdateTest(Test currentData)
{}
public void DeleteTest(Test currentData)
{}
}
Сторона Silverlight......
private void GetTest_Click(object sender, RoutedEventArgs e)
{
dc.Load(dc.GetTestQuery(),
LoadBehavior.RefreshCurrent ,
TestLoaded,
null);
}
private void TestLoaded(LoadOperation lo)
{
var ce =dc.Tests.CanEdit;
dc.Tests.ToList()[0].TestQuestions.ToList()[0].StudentAnswerID = 2;
}
2 ответа
Почему вы вызываете ToList()? RIA возвращает EntitySet, который наследуется от IEnumerable, поэтому вам не нужно помещать его в список. Я бы предложил попробовать выражение linq, например:
using System.Linq;
Test mytest = dc.Tests.Where( x=> x.StudentAnswerID = 2).FirstorDefault();
Что касается проблемы редактирования... Если вы используете Entity Framework в качестве модели данных, обязательно установите флажок "включить редактирование" при создании службы домена. CanEdit - это значение только для чтения, которое сообщает вам, разрешено ли редактирование.
Эй, @johnnywhoop, ты знаешь, что можешь дать FirstorDefault предикат, верно? Значение вместо того, чтобы сказать:
Test mytest = dc.Tests.Where( x=> x.StudentAnswerID = 2).FirstorDefault();
Ты должен сказать:
Test mytest = dc.Tests.FirstorDefault(x=> x.StudentAnswerID == 2);
Также вам нужно указать оператор "==", а не оператор "=". В противном случае вы просто устанавливаете это. Ну, на самом деле, это не будет строить.