WCF返回有WCF属性的实体框架类

时间:2016-12-07 00:22:37

标签: c# .net entity-framework wcf

我最近与一位从未使用过实体框架的程序员交谈过,但经常使用WCF服务。所以我决定使用实体框架代码第一种方法创建一些模型。我以为我在类中添加了适当的属性,以便可以返回数据等等。但是,在visual studio中测试服务时,我得到了这个例外。

- Update-- 删除虚拟关键字的类内部使一切正常。但是,在我返回的课程中,测验不再具有条款属性中的任何值。

- Update-- 找到一种不是我真正想要的方式,但它有效。创建了两个新类DB_Quiz,DB_Term,它们与虚拟关键字之外的实体框架类相同。 然后在方法调用期间我做了类似的事情。

var query = (from search in db.Quizes select new DB_Quiz() {
                ID =search.ID, Title = search.Title

            });

            var obj = query.FirstOrDefault();


            var termQuery = (from search in db.Terms where search.Quiz.ID == obj.ID select new DB_Term() {
                ID = search.ID, Phrase = search.Phrase, Definition = search.Definition
            }).ToList();

            obj.Terms = termQuery;

- Update-- 找到了一个很好的解决方案,但是与这个问题有关,它没有正确回答。与上面的更新相同,但linq查询略高一些。

var query = (from search in db.Quizes
                         select new DB_Quiz()
                         {
                             ID = search.ID,
                             Title = search.Title,
                             Terms =
                             (from inner in search.Terms select new DB_Term() {
                                 ID = inner.ID, Phrase = inner.Phrase, Definition = inner.Phrase
                             }).ToList()
                         });

            return query.ToList();

接收到http://localhost:61149/DataWorker.svc的HTTP响应时发生错误。这可能是由于服务端点绑定不使用HTTP协议。这也可能是由于服务器中止HTTP请求上下文(可能是由于服务关闭)。有关详细信息,请参阅服务器日志。

我只想构建我的后端以使用实体框架,因为我看到它使得使用数据库变得如此简单。有人请帮我理解这个问题。我真的想坚持WCF服务,因为我使用UWP作为我的客户端应用程序。从我所看到的,实体框架不能很好地与WCF服务配合使用。

我的课程: ContextClass -

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Runtime.Serialization;
using System.Web;

namespace QuizletBackend.Models
{
    [DataContract]
    public class QuizContext : DbContext
    {
        public QuizContext() : base("name=LocalServer")
        {

        }

        [DataMember]
        public DbSet<Quiz> Quizes { get; set; }
        [DataMember]
        public DbSet<Term> Terms { get; set; }
    }
}

测验课 -

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Runtime.Serialization;
using System.Web;

namespace QuizletBackend.Models
{
    [DataContract]
    public class Quiz
    {
        [Key]
        [DataMember]
        public int ID { get; set; }

        [DataMember]
        [Index(IsUnique = true)]
        [StringLength(150, ErrorMessage = "Title cannot exceed 150 characteres.")]
        public String Title { get; set; }
        [DataMember]
        public virtual List<Term> Terms { get; set; } = new List<Term>();
    }
}

术语类 -

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Runtime.Serialization;
using System.Web;

namespace QuizletBackend.Models
{
    [DataContract]
    public class Term
    {
        [DataMember]
        [Key]
        public int ID { get; set; }
        [DataMember]
        public String Phrase { get; set; }
        [DataMember]
        public String Definition { get; set; }
        [DataMember]
        public virtual Quiz Quiz { get; set; }
    }
}

Server stack trace: 
   at System.ServiceModel.Channels.HttpChannelUtilities.ProcessGetResponseWebException(WebException webException, HttpWebRequest request, HttpAbortReason abortReason)
   at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
   at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
   at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
   at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)

Exception rethrown at [0]: 
   at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   at IDataWorker.DoWork()
   at DataWorkerClient.DoWork()

Inner Exception:
The underlying connection was closed: An unexpected error occurred on a receive.
   at System.Net.HttpWebRequest.GetResponse()
   at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)

Inner Exception:
Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host.
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.PooledStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.Connection.SyncRead(HttpWebRequest request, Boolean userRetrievedStream, Boolean probeRead)

Inner Exception:
An existing connection was forcibly closed by the remote host
   at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)

0 个答案:

没有答案
相关问题