【问题标题】:DomainContext, Silverlight 3, code behind, Edit EntitySetDomainContext,Silverlight 3,代码隐藏,编辑实体集
【发布时间】:2010-02-02 06:00:28
【问题描述】:

我正在努力让我的大脑围绕 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

但下一行给出了错误: 此“SilverlightApplication2.Web.Question”类型的 EntitySet 不支持“编辑”操作。

所以我的问题是为什么 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)
    {}
}

银光面……

      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;
    }

【问题讨论】:

    标签: silverlight silverlight-3.0 wcf-ria-services entityset


    【解决方案1】:

    为什么要调用 ToList()? RIA 返回一个继承自 IEnumerable 的 EntitySet,因此您不需要将其放入列表中。我建议尝试如下 linq 语句:

    using System.Linq;
    Test mytest = dc.Tests.Where( x=> x.StudentAnswerID = 2).FirstorDefault();
    

    至于编辑问题...如果您使用实体框架作为数据模型,请务必在创建域服务时选中“启用编辑”复选框。 CanEdit 是一个只读值,它告诉您是否允许编辑。

    【讨论】:

      【解决方案2】:

      嘿,@johnnywhoop,你知道你可以给 FirstorDefault 一个谓词,对吧?意思,而不是说:

      Test mytest = dc.Tests.Where( x=> x.StudentAnswerID = 2).FirstorDefault();
      

      你应该说:

      Test mytest = dc.Tests.FirstorDefault(x=> x.StudentAnswerID == 2);
      

      此外,您需要提供“==”运算符而不是“=”运算符。否则你只是设置它。好吧,实际上,它不会构建。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-07
        • 2012-06-28
        • 1970-01-01
        相关资源
        最近更新 更多