最近我的一个朋友向我询问了N-Tier架构,我能够向他解释一下1,2和3层架构的例子.但是当我想提供超过3层的例子时,我被困住了.我用谷歌搜索并帮忙,但找不到任何体面的例子.
它被命名为N层这一事实使我认为'N'可以是从1开始的任何数字.但我找不到任何4或5层的例子.
有人可以分享一些涉及超过3层的N层架构的例子吗?
我有WebApi控制器,其名称后缀为"Api"后缀(例如:StudentsApiController,InstructorsApiController).我这样做是为了轻松区分我的MVC控制器和WebApi控制器.我希望我的WebApi路线看起来类似于
http://localhost:50009/api/students/5而不是http://localhost:50009/api/studentsapi/5.
目前为实现这一目标,我正在设置路线
routes.MapHttpRoute(
name: "GetStudents",
routeTemplate: "api/students/{id}",
defaults: new { controller = "StudentsApi", id = RouteParameter.Optional });
routes.MapHttpRoute(
name: "GetInstructors",
routeTemplate: "api/instructors/{id}",
defaults: new { controller = "InstructorsApi", id = RouteParameter.Optional });
Run Code Online (Sandbox Code Playgroud)
由于我必须为控制器中的每个方法添加路由,因此这非常麻烦.我希望应该有一种简单的方法来设置路由模板,在处理路由时自动添加控制器名称的"api"后缀.
我试图理解EF4中的继承映射.
我的数据库有两个表,结构如下:
PersonCategory表:
人员表
PersonCategory表有四个条目,每个条目代表一个类别 - Student,CourseInstructor,Staff和Advisor.
从在线阅读文章,我认为Table Per Hierarchy将是适用于此场景的模型.所以在EF4中,我创建了四个实体(Student,CourseInstructor,Staff和Advisor),每个实体都继承自Person表.然后我将它们中的每一个映射到Person表并向每个表添加一个条件(例如,StudentID = 1表示Student实体,CategoryID = 2表示Staff实体)以区别于其他表.我还从Person表中删除了CategoryID属性并使其成为抽象类.但是我收到以下错误,因为我从Person表中删除了CategoryId属性.
错误3015:从第101,108,114,120,126,133行开始映射片段时出现问题:从表Person(CategoryID)到表PersonCategory(CategoryID)的外键约束'FK_Person_PersonCategory'::映射不足:必须映射外键一些参与概念方面的外键关联的AssociationSet或EntitySets.
Table Per Hierarchy是适用于此场景的模型吗?如果没有,那么我应该如何在EF4中处理这种情况?
.net inheritance hierarchy entity-framework-4 table-per-hierarchy
我正在尝试使用iTextSharp来读取/修改PDF元数据.我想出了如何使用pdfreader和pdfstamper来做到这一点.我想知道我是否还可以读取/修改其他元数据信息,如版权信息和XMP photoshop命名空间中的其他几个.
我非常感谢任何解决方案的指针.
谢谢,Murugesh.
我试图使用NETFx Json.NET MediaTypeFormatter nuget包在我的WCF REST服务(4.0框架)中交换默认的DataContractJsonSerializer.我在我的项目中下载了包,并在Global.asax文件中添加了以下代码行.
void Application_Start(object sender, EventArgs e)
{
RegisterRoutes();
// Create Json.Net formatter serializing DateTime using the ISO 8601 format
var serializerSettings = new JsonSerializerSettings();
serializerSettings.Converters.Add(new IsoDateTimeConverter());
var config = HttpHostConfiguration.Create();
config.Configuration.OperationHandlerFactory.Formatters.Clear();
config.Configuration.OperationHandlerFactory.Formatters.Insert(0, new JsonNetMediaTypeFormatter(serializerSettings));
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行该服务时,它仍然使用DataContractJsonSerilizer进行序列化.以下是我从我的服务中返回的课程.
[DataContract]
public class SampleItem
{
[DataMember]
public int Id { get; set; }
[DataMember]
public string StringValue { get; set; }
[DataMember]
public DateTime DateTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
以下是Fiddler服务的回复.

您可以看到DateTime不是我在上面代码中的serializerSettings中指定的ISO格式.这告诉我JSON.NET序列化程序不用于序列化对象.
非常感谢任何帮助.
下面是我的SQL查询的简化版本,它使用CONTAINSTABLE进行全文搜索.
DECLARE @pSearchFor AS NVARCHAR(100);
SET @pSearchFor = 'SomeKeyword';
SELECT MS.[ModuleScreenID] AS ScreenID
,MS.[ModuleScreenCode] AS ScreenCode
,M.[Description] AS ModuleDescription
,M.[ModuleCode] AS ModuleCode
,FT.[Rank]
FROM ModuleScreen MS
JOIN Module M ON MS.ModuleID = M.ModuleID
JOIN CONTAINSTABLE(ModuleScreen, *, @pSearchFor) FT ON MS.ModuleScreenID = FT.[KEY]
Run Code Online (Sandbox Code Playgroud)
我想为@pSearchFor参数传递空值或空值,以便通过全文搜索返回所有记录.但是当我传递空值或空值时,我得到一个"空或空全文谓词"错误.谷歌搜索后,我发现CONTAINSTABLE不能为关键字取一个空参数.我也在SO中看过这个问题,但它对我没有帮助.
我可以使用CONTAINSTABLE进行条件连接(仅当为@pSearchFor参数指定了值时)吗?我不知道如何实现这一目标.非常感谢任何指针.
在浏览SQL profiler时,我注意到EF4生成了以下查询.
exec sp_executesql N'declare @p int
update [dbo].[User]
set @p = 0
where (([UserID] = @0) and ([RowVersion] = @1))
select [RowVersion]
from [dbo].[User]
where @@ROWCOUNT > 0 and [UserID] = @0',N'@0 int,@1 binary(8)',@0=1,@1=0x000000000042DDCD
Run Code Online (Sandbox Code Playgroud)
我不确定为什么EF4会生成这个,而我实际上并没有更新UnitOfWork中User表的任何列.运行此查询会更新RowVersion列(timestamp数据类型),该列会在下一个UnitOfWork中导致OptimisticConcurrencyException.
一个快速的谷歌搜索引导我到这个链接,这确认其他人也遇到了这种情况,但尚未找到解决方案.
非常感谢任何指针.
编辑:复制问题的示例代码.

用户和会话表具有外键关系.此外,在EF4中,我已将两个实体的RowVersion列的"并发模式"属性设置为" 固定".
下面是复制方案的示例方法.
private static void UpdateSession()
{
using (var context = new TestEntities())
{
context.ContextOptions.ProxyCreationEnabled = false;
var session = context.Users.Include("Sessions").First().Sessions.First();
session.LastActivityTime = DateTime.Now;
context.ApplyCurrentValues("Sessions", session);
context.SaveChanges(); …Run Code Online (Sandbox Code Playgroud) 我试图在Sitecore中以编程方式发布.出版工作正常.但以编程方式执行此操作并不会清除sitecore缓存.以编程方式清除缓存的最佳方法是什么?
我正在尝试使用暂存模块附带的Web服务.但是我收到了一个错误的请求异常(异常:远程服务器返回了一个意外的响应:(400)Bad Request.).我试图在客户端配置文件上增加服务receivetimeout和sendtimeout,但这并没有解决问题.任何指针都会非常感激?
我使用以下代码:
CacheClearService.StagingWebServiceSoapClient client = new CacheClearService.StagingWebServiceSoapClient();
CacheClearService.StagingCredentials credentials = new CacheClearService.StagingCredentials();
credentials.Username = "sitecore\adminuser";
credentials.Password = "***********";
credentials.isEncrypted = false;
bool s = client.ClearCache(true, dt, credentials);
Run Code Online (Sandbox Code Playgroud)
我正在使用以下代码进行发布.
Database master = Sitecore.Configuration.Factory.GetDatabase("master");
Database web = Sitecore.Configuration.Factory.GetDatabase("web");
string userName = "default\adminuser";
Sitecore.Security.Accounts.User user = Sitecore.Security.Accounts.User.FromName(userName, true);
user.RuntimeSettings.IsAdministrator = true;
using (new Sitecore.Security.Accounts.UserSwitcher(user))
{
Sitecore.Publishing.PublishOptions options = new Sitecore.Publishing.PublishOptions(master, web,
Sitecore.Publishing.PublishMode.Full, Sitecore.Data.Managers.LanguageManager.DefaultLanguage, DateTime.Now);
options.RootItem = master.Items["/sitecore/content/"];
options.Deep = true;
options.CompareRevisions = true;
options.RepublishAll = true;
options.FromDate = DateTime.Now.AddMonths(-1); …Run Code Online (Sandbox Code Playgroud) 我想知道是否有一种方法可以自动标记变更集,因为它在本地提交或推送到kiln存储库时.
我希望每个变更集都有一个带有版本/内部版本号的标记.我打算将我的版本/内部版本号存储在数据库中,并希望脚本从数据库中检索此值并向变更集添加标记.是否可以自动调用脚本来执行此操作作为提交后事件或推送到窑存储库时的推送后事件?
我也对任何其他方法都持开放态度,以便在每次提交/推送时实现自动标记.
在我的sql server表中,我想添加一个计算列,它是同一个表中其他列的哈希值.下面是我的表格结构.
地址:
AddressID(int,PK)
AddressLine1(nvarchar)
AddressLine2(nvarchar)
City(nvarchar)
State(nvarchar)
AddressHash(computed column)
以下是我想在计算列中得到的内容:
MASTER.SYS.FN_VARBINTOHEXSUBSTRING(0, HASHBYTES('SHA1',COALESCE(AddressLine1, N'') + COALESCE(AddressLine2, N'') + COALESCE(City, N'') + COALESCE(State, N'')), 1, 0)
Run Code Online (Sandbox Code Playgroud)
如果我右键单击该表并转到设计并在"计算列规范"下输入上面的"公式",我会收到以下错误:
- 无法修改表格.
在此上下文中,用户定义的函数名称不能以数据库名称为前缀.
所以我想我会使用用户定义的函数来计算哈希并将udf映射到公式.
下面是我用来创建UDF的代码:
CREATE FUNCTION udfHashAddress
(
@pAddressLine1 nvarchar(50), @pAddressLine2 nvarchar(50), @pCity nvarchar(50), @pState nvarchar(50))
)
RETURNS nvarchar(max) -- not sure what the correct size would be
WITH SCHEMABINDING
AS
BEGIN
DECLARE @result nvarchar(max)
SELECT @result = MASTER.SYS.FN_VARBINTOHEXSUBSTRING(0, HASHBYTES('SHA1',COALESCE(@pAddressLine1, N'') + COALESCE(@pAddressLine2, N'') + COALESCE(@pCity, N'') + COALESCE(@pState, N'')), 1, …Run Code Online (Sandbox Code Playgroud) 我正在研究sql服务器服务代理作为我们应用程序的消息处理技术。
在我们的方案中,从一个客户端应用程序(WPF)发送的消息需要在服务代理中排队,其他客户端应用程序(android)会接收它们。消息是时间敏感的,接收者需要在消息被发送到队列后的“ X”分钟(例如2分钟)之内接收,如果到那时仍无法接收,则消息必须过期并从接收者中删除。队列。
有没有办法告诉服务代理在“ x”分钟后使消息超时?
编辑:添加了我用来测试此脚本。
CREATE DATABASE ServiceBrokerTest
GO
ALTER DATABASE ServiceBrokerTest SET ENABLE_BROKER WITH ROLLBACK IMMEDIATE
GO
/****** Object: MessageType [SampleMsgType] ***/
CREATE MESSAGE TYPE [SampleMsgType] AUTHORIZATION [dbo] VALIDATION = NONE
GO
/****** Object: ServiceContract [MsgContract] ******/
CREATE CONTRACT [MsgContract] AUTHORIZATION [dbo] ([SampleMsgType] SENT BY INITIATOR)
GO
/****** Object: ServiceQueue [dbo].[Queue1] ******/
CREATE QUEUE [dbo].[Queue1] WITH STATUS = ON , RETENTION = OFF , POISON_MESSAGE_HANDLING (STATUS = ON) ON [PRIMARY]
GO
/****** Object: BrokerService [MsgService] ******/
CREATE …Run Code Online (Sandbox Code Playgroud) sql-server ×3
wcf-web-api ×2
.net ×1
architecture ×1
c# ×1
caching ×1
clear ×1
fogbugz ×1
hierarchy ×1
inheritance ×1
itextsharp ×1
json.net ×1
kiln ×1
mercurial ×1
metadata ×1
nuget ×1
pdf ×1
rest ×1
service ×1
sitecore ×1
sql ×1
ssms ×1
staging ×1
tags ×1
wcf-rest ×1
web-services ×1
xmp ×1