我有两个表用于跟踪我网站上的用户会话。这是一个粗略的过度简化btw:
Campaign:
campaignId [int]
campaignKey [varchar(20)]
description [varchar(50)]
Session:
sessionDate [datetime]
sessionGUID [uniqueidentifier]
campaignId [int]
campaignKey [varchar(20)]
我想使用LINQ:
在Session中插入一条新记录 var s = new Session();
dbContext.Session.InsertOnSubmit(s);
s.sessionDate = DateTime.Now;
s.sessionGUID = Guid.NewGuid();
s.campaignKey = Request.Params["c"];
// dont set s.campaignId here...
dbContext.SubmitChanges();
请注意,我目前没有在此代码中设置campaignId
。
我想要的是某些自动将外键连接到'Campaign'表,如果广告系列传入,它必须首先向'Campaign'表添加新行以前从未使用过。
我有一些决定要做,并且非常感谢对其中任何一个的见解:
我不知道是否应该使用触发器,存储过程或在LINQ中手动执行:
触发:稍微icky,从不真正喜欢使用它们,但会保证'campaignId'在我需要时更新
存储过程:再次稍微icky,我的SQL不是很好,我重视能够尽可能地在LINQ中做所有事情的一致性。
Linq手动:我必须在内存中保留“Campaign”表的副本,并使用C#哈希表进行查找。如果另一个客户添加了一个新的广告系列,我就不得不担心让该表保持最新状态。
在有人询问之前我不提前知道这些活动,因为有些活动会由合作伙伴创建。
最重要的是:我主要寻找最“友好的LINQ”解决方案。
答案 0 :(得分:1)
我肯定会建议在Session表上添加一个可以为空的外键约束。一旦你有了这个设置,它应该像在Session类的方法上一样简单:
public partial class Session
{
public void SetCampaignKey(string key)
{
// Use an existing campaign if one exists
Campaign campaign =
from c in dbContext.Campaigns
where c.campaignKey == key
select c;
// Create a new campaign if necessary
if (campaign == null)
{
campaign = new Campaign();
campaign.campaignKey = key;
campaign.description = string.Empty; // Not sure where this comes in
dbContext.Campaign.InsertOnSubmit(campaign);
}
// We can now set the reference directly
this.Campaign = campaign;
}
}
我的LINQ可能有点偏,但这样的事情应该有用。
您可以调用SetCampaignKey()而不是手动设置campaignKey属性。当您调用dbContext.SubmitChanges时,将根据需要添加活动,并且会话条目将相应更新。
在这种情况下,只会自动设置campaignId属性。您可以依靠简单的触发器来设置campaignKey或取消它。您始终可以通过加入Campaign表来检索该值。
我是否过度简化了问题?