使用 Linq to SQL 自定义实现 DomainService
任何人都可以给我举一个例子或简要描述如何使用 Linq to SQL 作为数据访问层来创建 WCF RIA 服务 DomainService 的自定义实现,但不使用.dbml 文件(这是因为 Linq to SQL 模型是由自定义工具生成的,经过大量定制,并且是一个包含 50 多个表的相当大的数据库)并且没有 VS2010 向导来创建一个DomainService(该向导依赖于可用的 .dbml 文件)
这是我迄今为止尝试过的一个非常简单的外壳:
[EnableClientAccess()]
public class SubscriptionService : DomainService
{
[Query(IsDefault = true)]
public IQueryable<Subscription> GetSubscriptionList()
{
SubscriptionDataContext dc = new SubscriptionDataContext();
var subs = dc.Subscription.Where(x => x.Status == STATUS.Active)
.Select(x =>
new Subscription
{
ID = x.ID,
Name = x.Name
}).ToList();
return subs.AsQueryable();
}
public void InsertSubscription(Subscription sub)
{
if (!sub.ID.IsEmpty())
{
SubscriptionDataContext dc = new SubscriptionDataContext();
Subscription tmpSub = dc.GetByID<Subscription>(sub.ID);
if (tmpSub != null)
{
tmpSub.Name = sub.Name;
dc.Save(tmpSub);
}
else
{
tmpSub = new Subscription();
tmpSub.Name = sub.Name;
dc.Save(tmpSub);
}
}
}
public void UpdateSubscription(Subscription sub)
{
if (!sub.ID.IsEmpty())
{
SubscriptionDataContext dc = new SubscriptionDataContext();
Subscription tmpSub = dc.GetByID<Subscription>(sub.ID);
if (tmpSub != null)
{
tmpSub.Name = sub.Name;
dc.Save(tmpSub);
}
}
}
public void DeleteSubscription(Subscription sub)
{
if (!sub.ID.IsEmpty())
{
SubscriptionDataContext dc = new SubscriptionDataContext();
Subscription tmpSub = dc.GetByID<Subscription>(sub.ID);
if (tmpSub != null)
{
dc.Delete(tmpSub);
}
}
}
}
到目前为止,这似乎有效。有人发现我可能遗漏的这种方法有什么问题吗?如果有人已经尝试过这种方法并发现了一些重大问题,我不想在错误的道路上走得太远。
感谢大家的意见。
Can anyone point me to an example of or briefly describe how one would go about creating a custom implementation of a WCF RIA Services DomainService using Linq to SQL as the data access layer but without the use of the .dbml file (this is because the Linq to SQL model is generated by a custom tool, is heavily cutomized, and is of a fairly large database with 50+ tables) and without the VS2010 wizard for creating a DomainService (the wizard is dependant on the .dbml file being available)
Here's a really simple shell of what I tried myself so far:
[EnableClientAccess()]
public class SubscriptionService : DomainService
{
[Query(IsDefault = true)]
public IQueryable<Subscription> GetSubscriptionList()
{
SubscriptionDataContext dc = new SubscriptionDataContext();
var subs = dc.Subscription.Where(x => x.Status == STATUS.Active)
.Select(x =>
new Subscription
{
ID = x.ID,
Name = x.Name
}).ToList();
return subs.AsQueryable();
}
public void InsertSubscription(Subscription sub)
{
if (!sub.ID.IsEmpty())
{
SubscriptionDataContext dc = new SubscriptionDataContext();
Subscription tmpSub = dc.GetByID<Subscription>(sub.ID);
if (tmpSub != null)
{
tmpSub.Name = sub.Name;
dc.Save(tmpSub);
}
else
{
tmpSub = new Subscription();
tmpSub.Name = sub.Name;
dc.Save(tmpSub);
}
}
}
public void UpdateSubscription(Subscription sub)
{
if (!sub.ID.IsEmpty())
{
SubscriptionDataContext dc = new SubscriptionDataContext();
Subscription tmpSub = dc.GetByID<Subscription>(sub.ID);
if (tmpSub != null)
{
tmpSub.Name = sub.Name;
dc.Save(tmpSub);
}
}
}
public void DeleteSubscription(Subscription sub)
{
if (!sub.ID.IsEmpty())
{
SubscriptionDataContext dc = new SubscriptionDataContext();
Subscription tmpSub = dc.GetByID<Subscription>(sub.ID);
if (tmpSub != null)
{
dc.Delete(tmpSub);
}
}
}
}
This seems to work so far. Does anyone see any problem with this approach that I might be missing? I don't want to go too far down the wrong road with this if someone has already tried this way and found some major problems with it.
Thanks for everyone's input.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这样做并没有什么错。
我也做过基本上同样的事情。
您将需要创建一个为每个查询返回 IQueryable 的属性,并且您将使用 RIA 服务自动神奇地获取“skip/take/where”内容。
我假设 Subscription 是 DTO 而不是 L2S 类,因为您正在显式实例化它。只需确保您的 DTO 具有正确的属性即可。即,
如果您的 DTO 中有子元素,请使用
Include
和Association
属性:另外,作为旁注,您的删除方法不需要完整的对象,像这样的东西会起作用,并且会阻止客户端序列化整个对象并在您不需要时将其发回。
There is nothing wrong with doing it this way.
I've done basically the same thing.
you will need to create a property that returns an IQueryable for each query, and you will auto-magically get the skip/take/where stuff with RIA Services.
I assume that
Subscription
is a DTO and not a L2S class because you are instantiating it explicitly. Just make sure you DTOs have the correct attributes. i.e.If you have child elements in your DTO, use the
Include
andAssociation
attributes :Also as a side note, you don't need the full object for your delete method, something like this would work and would keep the client from serializing the whole object and posting it back when you don't need too.