我最近与一位从未使用过实体框架的程序员交谈过,但经常使用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)