标题中说明的问题很简单:有没有办法在'App_Code'之外使用剃刀助手?
示例(HtmlEx.cshtml文件):
@helper Script(string fileName, UrlHelper url)
{
<script src="@url.Content("~/Scripts/" + fileName)" type="text/javascript"></script>
}
Run Code Online (Sandbox Code Playgroud)
我问这个是因为我在App_Code中没有任何其他内容; 我想构建我的项目有点不同.
谢谢.
更新:我不想要任何其他类型的扩展.斯科特在这里谈到的只是纯粹的剃刀助手:http://weblogs.asp.net/scottgu/archive/2011/05/12/asp-net-mvc-3-and-the-helper-syntax -within-razor.aspx
基本上我将EF与一次调用混合存储过程进行一些批量删除,否则EF太慢.
以下是此场景的一些伪代码(实际上我有更复杂的代码):
public void RemoveCustomer(int customerUID)
{
// this code is running in one db transaction
{
// retrieve certain orders of particular customer using EF
var orders = repoOrders.GetOrdersOfCustomer(filter, customerUID);
// do something with above orders before deletion using EF
repoX.DoSomethingWithOrders(orders);
// call SP to delete all orders of customer
repoOrders.DeleteAllOrdersOfCustomer(customerUID); // this calls a stored procedure
// delete customer using EF
repoCustomers.DeleteCustomer(customerUID); // throws exception due to relationship!
}
}
Run Code Online (Sandbox Code Playgroud)
客户订单当然是one-to-many(1:m)关系.
我想在上面的场景中避免在属于被删除的客户的上下文加载某些订单时抛出的异常.例外情况是:
"由于一个或多个外键属性不可为空,因此无法更改关系.当对关系进行更改时,相关的外键属性将设置为空值.如果外键是如果不支持空值,则必须定义新关系,必须为foreign-key属性分配另一个非空值,或者必须删除不相关的对象."
因此,我想知道是否可以<DbSet>.Local在调用存储过程之后和用户被删除之前清除部分/全部订单而不会对数据库造成任何更改. …
我有一个关于WCF大师的新问题.
所以,我有一个类User,它接近我用于数据库操作的DB的'User'表示.现在,我想有两个不同的服务合同,使用这个类作为数据合同,但每个都以他们自己的方式......我的意思是,
public class DBLayer
{
void InsertUsers(List<User> userList)
{
// both 'PropertyVisibleForService1' and 'PropertyVisibleForService2'
// are used HERE to be inserted into their columns
}
}
[DataContract]
public class User
{
[DataMember] public string PropertyVisibleOnlyForService1{...}
[DataMember] public string PropertyVisibleOnlyForService2{...}
}
[ServiceContract]
public interface IService1
{
List<User> GetUsers(); // user with 'PropertyVisibleOnlyForService1' inside
}
[ServiceContract]
public interface IService2
{
List<User> GetUsers(); // user with 'PropertyVisibleOnlyForService2' inside
}
Run Code Online (Sandbox Code Playgroud)
因此,我们的想法是每个服务都会得到一个不同类型的用户,即子集'User'.请记住,我想使用'User'原样进行数据库操作,我可以选择实现这一目标吗?我真的需要创建不同的数据合同还是有另一种更聪明的方法?
最好不仅要给我解决方案,还要向我解释一些最佳实践和替代方案.
先感谢您.
EDIT1:我在这里添加了一个虚拟DBLayer类,以便更好地概述,以及为什么我认为在这种情况下继承可能不太好.
一个解决方案是将另一个' UserForService1'和' …
我将使用3层架构构建服务,我真的很担心如何以事务处理方式处理操作.
我知道我有两个选择:IDbTransaction而且TransactionScope......但我并没有真正决定去哪一个,尽管我做了很多研究.
我会选择TransactionScope,但我不想涉及DTC ...而且我需要支持SQLServer2005和Oracle.(我知道我需要一次只打开一个连接)
我希望看到两种情况下使用它们的良好示例/模式...良好的链接可以做得很好.
类似于BL类和DAL类的样子......以及如何在它们之间创建和传递事务/连接.
Edit1: 我正在寻找一些这方面的实现(但对于这两个选项):
using(var scope = new TransactionScope())
{
// transactional methods
datalayer.InsertFoo();
datalayer.InsertBar();
scope.Complete();
}
Run Code Online (Sandbox Code Playgroud)
编辑2:
由于丹尼斯为我提供了一个非常好的选择...我还在等待有人向我展示一个模型的好例子,它使用' TransactionScope' 在业务层和数据层之间进行交互
谢谢.
我想将一个针对.NET Framework 4.6.1的库项目迁移到一个针对.NET Framework 4.6.1和.NET Standard 2.0的新项目.
<PropertyGroup Condition=" '$(OS)' == 'Windows_NT' ">
<TargetFrameworks>netstandard2.0;net461</TargetFrameworks>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)
在我目前使用的代码中,例如:System.Web.Hosting.HostingEnvironment.MapPath()method; 所以,我已经在我的.csproj文件中添加了一个条件:
<ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
<Reference Include="System.Web" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)
现在在我的代码中,我知道我可以有这样的东西:
#if NET461
if (someFolderVar.StartsWith("~/"))
someFolderVar = System.Web.Hosting.HostingEnvironment.MapPath(someFolderVar);
#endif
Run Code Online (Sandbox Code Playgroud)
我的问题:
如果稍后我将我的项目更改为目标.NET Framework 4.7,是否将执行上述代码或仅严格针对.NET Framework 4.6.1?4.6.1及以上的使用条件是什么?
我打算让一个核心模块公开接口,以便其他大模块(不同的客户端)进行通信.比方说,如果有一组方法:
void Method_A();
void Method_B();
void Method_X1();
Run Code Online (Sandbox Code Playgroud)
暴露给一种类型的客户端(模块"X1")和:
void Method_A();
void Method_B();
void Method_X2();
Run Code Online (Sandbox Code Playgroud)
暴露给其他类型的客户端(模块"X2")并知道Method_A并且Method_B应该具有确切的实现......那么我如何才能最好地设计服务架构(在服务和合同方面)?
有没有机会只实现一次Method_A和Method_B(在不同的合同实现中不是2次)?
使用WCF时,如何从界面继承中受益?
提前谢谢大家,如果我需要更清楚,请告诉我!
@marc_s ...我真的很感激你的观点......
可能周围有很多类似的问题,但由于我只知道很少的解决方案,我不确定这对我们有用,我正在寻找其他的东西,也许是新技术...
我们所拥有的是这个USB设备并不那么花哨(当然,它需要加载驱动程序),并且它有几个C++ dll来帮助从中获取某些输出.最重要的是,我们制作了一个C#桌面应用程序,它以更具吸引力的方式使用该设备(内部充足的互操作).
到目前为止一直很好,但要将应用程序提升到网络以获得更大的灵活性......有哪些选择?
已知的解决方案是:
还有其他方法吗?Silverlight 4,5(可能是"浏览器外")是一个可行的解决方案吗?那么现在这些新技术怎么样?Html 5还是什么?
编辑1:特别是我对Silverlight感兴趣.有没有办法使用Silverlight?
EDIT2:我发现了这个问题:Silverlight可以访问访问USB端口的.Net库吗?.我能从中得到什么?对于我的场景,Silverlight真的不是一个可行的解决方案吗?
编辑3:非常重要!
提前致谢.
这是我需要帮助的代码的一部分:
// simple service locator
public class ServiceManager<TSvc> : IServiceManager<TSvc> where TSvc: class, IService
{
private Dictionary<object, TSvc> services;
public void RegisterService(TSvc service)
{
// omitted code here
this.services.Add(service.GetType(), service); // dictionary
}
public T GetService<T>() where T : TSvc
{
T result = default(T);
TSvc bufResult = null;
if (this.services.TryGetValue(typeof(T), out bufResult))
result = (T)bufResult;
return result;
}
public TSvc GetService(Type serviceType)
{
TSvc result = null;
this.services.TryGetValue(serviceType, out result);
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我的域名接口:
public interface IItem
{ …Run Code Online (Sandbox Code Playgroud) 我有两个不同的工作单元:一个基于ADO.NET,主要调用存储过程(uowADO)和另一个使用Entity Framework 6(uowEF),最近添加以支持Oracle数据库,因此我不必重写所有SP(我的知识在那里有限).
因此,在对数据库执行操作时,业务层只加载其中一个(基于配置)(但我不能并行使用它们,因为uowADO不支持Oracle)
添加新的后uowEF我注意到了大的性能问题,当然主要是关于批量操作.
基本上我现在只有Commit和Rollback当前的方法IUnitOfWork...非常接近本文的建议.
所以,我正在考虑重做这个工作单元.例如,我读到了有关dbContext.Configuration.AutoDetectChangesEnabled涉及批量操作时的禁用,以及有关EF的其他此类优化提示可能有所帮助.
不幸的是,我不确定如何设计这样的工作单元以使其通用,以便我可以在BL和数据访问层的所有情况下使用它:ADO.NET和EF.
有什么想法,建议和良好的链接吗?
我有这个SQL函数,它由一个存储过程包装:
ALTER FUNCTION dbo.GetObjList
(
@filterUID int = NULL,
@filterSID varchar(32) = NULL
)
RETURNS TABLE
AS
RETURN
SELECT ROW_NUMBER() OVER (ORDER BY UID) AS [RowNumber], *
FROM ObjTable
WHERE
(COALESCE(@filterUID, @filterSID) IS NULL) OR
(
((@filterUID IS NOT NULL) AND (UID = @filterUID)) OR
((@filterSID IS NOT NULL) AND (SID = @filterSID))
)
Run Code Online (Sandbox Code Playgroud)
为什么我会收到这样的错误:"将varchar值'abc'转换为数据类型int时转换失败." 如果我只@filterSID = 'abc'作为参数传递(和其他人的DEFAULT)?
我注意到COALESCE负责这个错误.
编辑:现在我得到了错误的原因...并且考虑到我实际上有很多参数...你们会推荐什么作为解决方案?
c# ×7
.net ×3
wcf ×2
app-code ×1
browser ×1
coalesce ×1
contracts ×1
device ×1
generics ×1
helper ×1
interface ×1
orm ×1
performance ×1
razor ×1
service ×1
silverlight ×1
sql-function ×1
sql-server ×1
target ×1
transactions ×1
unit-of-work ×1
usb ×1