我正在为所有内容运行beta7,包括EF 7.我正在尝试使用ASP.NET 5应用程序模板项目连接到我的远程现有数据库.我的project.json看起来像这样:
{
"webroot": "wwwroot",
"userSecretsId": "aspnet5-XXX-409e9e37-b7bb-4185-b7aa-6dc336087524",
"version": "1.0.0-*",
"dependencies": {
"EntityFramework.Commands": "7.0.0-beta7",
"EntityFramework.SqlServer": "7.0.0-beta7",
"Microsoft.AspNet.Authentication.Cookies": "1.0.0-beta7",
"Microsoft.AspNet.Authentication.Facebook": "1.0.0-beta7",
"Microsoft.AspNet.Authentication.Google": "1.0.0-beta7",
"Microsoft.AspNet.Authentication.MicrosoftAccount": "1.0.0-beta7",
"Microsoft.AspNet.Authentication.Twitter": "1.0.0-beta7",
"Microsoft.AspNet.Diagnostics": "1.0.0-beta7",
"Microsoft.AspNet.Diagnostics.Entity": "7.0.0-beta7",
"Microsoft.AspNet.Identity.EntityFramework": "3.0.0-beta7",
"Microsoft.AspNet.Mvc": "6.0.0-beta7",
"Microsoft.AspNet.Mvc.TagHelpers": "6.0.0-beta7",
"Microsoft.AspNet.Server.IIS": "1.0.0-beta7",
"Microsoft.AspNet.Server.WebListener": "1.0.0-beta7",
"Microsoft.AspNet.StaticFiles": "1.0.0-beta7",
"Microsoft.AspNet.Tooling.Razor": "1.0.0-beta7",
"Microsoft.Framework.Configuration.Abstractions": "1.0.0-beta7",
"Microsoft.Framework.Configuration.Json": "1.0.0-beta7",
"Microsoft.Framework.Configuration.UserSecrets": "1.0.0-beta7",
"Microsoft.Framework.Logging": "1.0.0-beta7",
"Microsoft.Framework.Logging.Console": "1.0.0-beta7",
"Microsoft.Framework.Logging.Debug" : "1.0.0-beta7",
"Microsoft.VisualStudio.Web.BrowserLink.Loader": "14.0.0-beta7"
},
"commands": {
"web": "Microsoft.AspNet.Hosting --config hosting.ini",
"ef": "EntityFramework.Commands"
},
"frameworks": {
"dnx451": { },
"dnxcore50": { }
},
"exclude": [ …Run Code Online (Sandbox Code Playgroud) 在我的一个API动作(PostOrder)中,我可能正在使用API(CancelOrder)中的另一个动作.两者都返回一个JSON格式的ResultOrderDTO类型,设置ResponseTypeAttribute为两个动作的一个,如下所示:
public class ResultOrderDTO
{
public int Id { get; set; }
public OrderStatus StatusCode { get; set; }
public string Status { get; set; }
public string Description { get; set; }
public string PaymentCode { get; set; }
public List<string> Issues { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我需要的是ResultOrderDTO从中读取/解析响应CancelOrder,以便我可以将其用作响应PostOrder.这就是我的PostOrder代码:
// Here I call CancelOrder, another action in the same controller
var cancelResponse …Run Code Online (Sandbox Code Playgroud) 我在我的控制器中执行模型验证,但需要在服务/业务级别进行第二次业务验证.这通常与用户权限有关:当前用户是否可以访问他尝试获取或发布的客户/订单信息?
我的第一个(也是工作的)方法是传递整个User实例或它Id(通过调用User.Identity.GetUserId()),这对于大多数情况来说都是足够的 - 如果不是全部的话.所以我会有这样的事情:
public IHttpActionResult Get(int id)
{
try
{
var customer = customerService.GetById(id, userId);
return Ok(customer);
}
catch (BusinessLogicException e)
{
return CreateErrorResponse(e);
}
}
Run Code Online (Sandbox Code Playgroud)
但我真的不喜欢这样一个事实:通过这种方法,我将不得不在几乎每次调用我的服务层时都包含一个额外的参数.如果我正在调用GetById()方法,我希望通过提供ID来获取内容,而不是ID 和用户ID.
一个简单的解决方法是沿着这些方向,这也适用:
public IHttpActionResult Get(int id)
{
customerService.SetCurrentUser(User.Identity.GetUserId());
try
{
var customer = customerService.GetById(id);
return Ok(customer);
}
catch (BusinessLogicException e)
{
return CreateErrorResponse(e);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我不希望单独调用来设置当前用户,而是希望每次调用服务时都自动执行此操作.我该怎么做?
这是我的服务的样子:
public class CustomerService : EntityService<Customer>, ICustomerService
{
public string UserId;
IContext context;
public CustomerService(IContext context) : …Run Code Online (Sandbox Code Playgroud) 我想在运行时更改我的日志名称而不更改附加程序。基本上,一旦到了一天中的某个设定时间,我希望能够使用不同的文件。
这是我的 appender 的样子:
<appender name="info" type="log4net.Appender.RollingFileAppender">
<file value="logs\" />
<datePattern value="yyyyMMdd'_INFO.log'" />
<staticLogFileName value="false" />
<appendToFile value="true" />
<rollingStyle value="Composite" />
<maxSizeRollBackups value="10" />
<maximumFileSize value="10MB" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%newline[%date]-%level-%logger[%M]- Linea:%L - %message%newline"/>
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="INFO"/>
<param name="LevelMax" value="INFO"/>
</filter>
</appender>
Run Code Online (Sandbox Code Playgroud)
这是我遍历 appender 的函数:
public void SetLogFile(string fileName)
{
foreach (var appender in log.Logger.Repository.GetAppenders())
{
try
{
((log4net.Appender.FileAppender)appender).File = fileName;
((log4net.Appender.FileAppender)appender).ActivateOptions();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
SetLogFile("log1.txt");
Run Code Online (Sandbox Code Playgroud)
它为此特定示例创建以下文件:
log1.txt20171221_INFO.log
我希望我的日志文件被命名,log1.txt …
我有一个模型,我使用DataAnnotations来执行验证,例如
public class OrderDTO
{
[Required]
public int Id { get; set; }
[Required]
public Decimal Amount { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我检查每个请求中的ModelState以确保JSON有效.
但是,我在Amount上面的数字属性方面遇到了麻烦.即使它被设置为[Required],如果它没有包含在JSON中,它将跳过ModelState验证,因为它自动默认为0而不是null,因此模型看起来有效,即使它不是.
"修复"这个的简单方法是将所有数字属性设置为可为空(int?,Decimal?).如果我这样做,默认为0并不会发生,但我不喜欢这个作为一个明确的解决方案,因为我需要改变我的模型.
有没有办法设置属性,null如果它们不是JSON的一部分?
我正在使用由许多人随着时间推移开发的数据库.关于成本或价格的领域存在许多不一致之处; 在某些表中,这些列为NULL,而在其他表中,它们不是NULL.我正在考虑将表格和代码更新为某个标准.
我看到允许NULL的唯一优点是你没有设置值(NULL)或设置为空白(0.00)的值之间的区别.如果列是非NULL,则所有记录默认为0.00,并且您将无法确定用户将哪些记录设置为0.00.另一方面,对于用户在系统中将成本或价格设置为0.00没有任何意义.
在您看来,最佳做法是什么?
c# ×5
asp.net ×3
.net ×2
json ×2
api ×1
asp.net-core ×1
asp.net-mvc ×1
dnx ×1
log4net ×1
null ×1
sql ×1
sql-server ×1
t-sql ×1