WCF数据服务是否支持使用实体框架代码优先(4.1)?它似乎很难理解如何处理DbSet
或DbContext
。我想这应该不会太令人惊讶,因为EFCF是在数据服务之后发布的。
internal class Context:DbContext {
public Context(String nameOrConnectionString) : base(nameOrConnectionString) { }
public DbSet<AlertQueue> Alerts { get; set; }
}
public class EntitySet:Abstract.EntitySet {
public EntitySet(String nameOrConnectionString) {
var context = new Context(nameOrConnectionString);
this.AlertQueueRepository = new Concrete.AlertQueueRepository(new Repository<AlertQueue>(context, context.Alerts));
}
}
public class AlertQueueRepository:EntityRepository<AlertQueue> {
public AlertQueueRepository(IEntityRepository<AlertQueue> entityRepository):base(entityRepository) { }
public IQueryable<AlertQueue> Pending {
get {
return (from alert in this.All
where alert.ReviewMoment == null
select alert);
}
}
}
CCD_ 3和CCD_ 4为CCD_ 5和其他CRUD函数提供了通用方法。这是WCF数据服务不起作用:
public class WcfDataService1:DataService<Domain.Concrete.AlertQueueRepository> {
public static void InitializeService(DataServiceConfiguration config) {
config.SetEntitySetAccessRule("All", EntitySetRights.AllRead);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
}
}
您需要安装Microsoft WCF Data Services 2011 CTP2。
以下是ADO.NET团队博客中的一篇循序渐进的好文章:使用实体框架4.1和代码优先的WCF数据服务
您需要更改"System.Data.Services"one_answers"System.DataServices.Client"的引用安装CTP后,您将拥有一个新的V3协议版本(DataServiceProtocolVersion.V3)
添加下面这样的构造函数来传递连接字符串或数据库名称
public class HospitalContext : DbContext
{
public HospitalContext(string dbname) : base(dbname)
{
}
public DbSet<Patient> Patients { get; set; }
public DbSet<LabResult> LabResults { get; set; }
}
我刚刚做了一个非常简单的测试:
WCF服务:
public class WcfDataService : DataService<Context>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("*", EntitySetRights.All);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
}
}
上下文:
public class Context : DbContext
{
public DbSet<User> Users { get; set; }
public Context()
{
this.Configuration.ProxyCreationEnabled = false;
}
}
[DataServiceKey("Id")]
public class User
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
它是有效的,但我担心它是只读的。这里有一个允许修改数据的变通方法。