关于 EF + WCF 数据服务(OData 是协议,WCF DS 是 OData 的 Microsoft 实现)最酷的部分是其中很多都是魔术。您不需要任何特殊的连接或其他魔法。
这里有一些代码可以帮助您入门:(我保证,我会在下面介绍它。)
using System;
using System.Data.Entity;
using System.Data.Services;
using System.Data.Services.Common;
using System.ServiceModel;
namespace Scratch.Web
{
// 4
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
// 1
public class ScratchService : DataService<ScratchContext>
{
static ScratchService()
{
// 2
Database.SetInitializer(new ScratchContextInitializer());
}
public static void InitializeService(DataServiceConfiguration config)
{
// 3
config.SetEntitySetAccessRule("*", EntitySetRights.All);
config.SetServiceOperationAccessRule("*", ServiceOperationRights.AllRead);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
// 4
config.UseVerboseErrors = true;
}
}
public class ScratchContextInitializer : DropCreateDatabaseIfModelChanges<ScratchContext>
{
protected override void Seed(ScratchContext context)
{
base.Seed(context);
// 5
context.Products.Add(new DiscontinuedProduct
{
Name = "DP1",
DiscontinuedAt = DateTime.Now.AddDays(-7)
});
context.Products.Add(new DiscountedProduct
{
Name = "DP1",
Discount = 3.14
});
}
}
// 6
public class ScratchContext : DbContext
{
public DbSet<Product> Products { get; set; }
}
// 7
public abstract class Product
{
public int ID { get; set; }
public string Name { get; set; }
}
// 7
public class DiscountedProduct : Product
{
public double Discount { get; set; }
}
// 7
public class DiscontinuedProduct : Product
{
public DateTime DiscontinuedAt { get; set; }
}
}
快速演练:
- 1:
ScratchService
在这种情况下是 WCF 数据服务。它继承自DataService<T>
并提供一个DbContext
(EF 概念)作为泛型类型。
- 2:我们使用静态构造函数来设置数据库初始化器,因为我一直在修改这段代码。
- 3:我们使实体集和服务操作对服务消费者可见(
*/All
不推荐这种方法。)
- 4:我们启用调试(总是有用的)
- 5:我们为数据库播种以获取一些数据
- 6:我们为 EF 创建一个
DbContext
并将抽象类公开Product
为DbSet
. (请注意,您需要 WCF DS 5 或更高版本才能使用DbContext
;WCF DS 5.0.1 [或 5.1.0-rc1,如果你够勇敢的话] 和 EF 4.3.1 一起玩得很好。)
- 7:我们创建一个类结构,根有一个抽象类和两个派生类。
请注意,当 EF 发挥作用时,您遵循其规则: - 我本可以ProductId
没有DataServiceKey
属性,并且 EF 会将其作为实体的密钥,WCF DS 将尊重 - TPT/TPH/TPC 都是每个 EF 设置 - 如果你想先从数据库中做代码(听起来你可能会这样做),有一个下载可以帮助你