我有两个双向一对多关系的实体:
public class Storage
{
public IList<Box> Boxes { get; set; }
}
public class Box
{
public Storage CurrentStorage { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和映射:
<class name="Storage">
<bag name="Boxes" cascade="all-delete-orphan" inverse="true">
<key column="Storage_Id" />
<one-to-many class="Box" />
</bag>
</class>
<class name="Box">
<many-to-one name="CurrentStorage" column="Storage_Id" />
</class>
Run Code Online (Sandbox Code Playgroud)
A Storage可以有很多Boxes,但Box只能属于一个Storage.我将它们映射,以便一对多有一个级联all-delete-orphan.
当我尝试更换Box时,我的问题就出现了Storage.假设我已经运行了这段代码:
var storage1 = new Storage();
var storage2 = new Storage();
storage1.Boxes.Add(new Box());
Session.Create(storage1);
Session.Create(storage2);
Run Code Online (Sandbox Code Playgroud)
以下代码将给我一个例外:
// get the first …Run Code Online (Sandbox Code Playgroud) 我有一个AutoMapperConfiguration静态类来设置AutoMapper映射:
static class AutoMapperConfiguration()
{
internal static void SetupMappings()
{
Mapper.CreateMap<long, Category>.ConvertUsing<IdToEntityConverter<Category>>();
}
}
Run Code Online (Sandbox Code Playgroud)
这IdToEntityConverter<T>是一个如下所示的自定义ITypeConverter:
class IdToEntityConverter<T> : ITypeConverter<long, T> where T : Entity
{
private readonly IRepository _repo;
public IdToEntityConverter(IRepository repo)
{
_repo = repo;
}
public T Convert(ResolutionContext context)
{
return _repo.GetSingle<T>(context.SourceValue);
}
}
Run Code Online (Sandbox Code Playgroud)
IdToEntityConverterIRepository在其构造函数中接受一个,以便通过命中数据库将ID转换回实际实体.请注意它没有默认构造函数.
在我的ASP.NET中Global.asax,这就是我所拥有的OnApplicationStarted()和CreateKernel():
protected override void OnApplicationStarted()
{
// stuff that's required by MVC
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
// our setup stuff …Run Code Online (Sandbox Code Playgroud) c# dependency-injection ninject inversion-of-control automapper
假设我有三个类是基类的子类:
public class BaseClass
{
public string BaseName { get; set; }
}
public class Subclass1 : BaseClass
{
public string SubName1 { get; set; }
}
public class Subclass2 : BaseClass
{
public string SubName2 { get; set; }
}
public class Subclass3 : BaseClass
{
public string SubName3 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想将这些映射到ViewModel类,如下所示:
public class ViewModel
{
public string BaseName { get; set; }
public string SubName1 { get; set; }
public string SubName2 { get; set; …Run Code Online (Sandbox Code Playgroud) 如何在ASP.NET MVC中动态调整图像大小?
我正在尝试从服务器上已有的图像自动创建缩略图.在ASP.NET Webforms中,我创建了一个HTTPHandler来执行此操作并在web.configfor for all images扩展中添加动词以通过处理程序.处理程序很好,如果你想要原始图像,你可以使用一个典型的图像标记:
<img src="pic.jpg"/>
但如果你想要一个调整大小的图像,你可以使用:
<img src="pic.jpg?width=320&height=240"/>
有没有办法在ASP.NET MVC中复制相同的行为?
假设我有一个像这样的POCO:
public class Name
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
FirstName和LastName不能为null.我应该添加这样的方法:
public List<Error> Validate()
{
var errors = new List<Error>();
if (String.IsNullOrEmpty(FirstName))
errors.Add(new Error("FirstName", "You must fill out first name."));
if (String.IsNullOrEmpty(LastName))
errors.Add(new Error("LastName", "You must fill out last name."));
}
Run Code Online (Sandbox Code Playgroud)
where Error是包含a的结构NameValueDictionary.这是一种很好的做事方式吗?我可能会发现存储库存在问题,有人试图保存此POCO而不先运行它Validate().
我正在为数据库操作编写一些NUnit测试.显然,如果Add()失败,那么Get()也会失败.然而,它看起来既欺骗Add()又Get()失败,因为看起来有两个问题而不是一个问题.
有没有办法为测试运行指定"顺序",因为如果第一次测试失败,则忽略以下测试?
在同一行中,有没有办法自己订购单元测试类?例如,我想在测试来自UI的往返数据之前首先运行我的基本数据库操作测试.
注意:这与测试相互依赖有点不同,更像是在运行一堆测试之前确保某些东西先工作.例如,如果您无法首先连接到数据库,那么运行大量数据库操作会浪费时间.
编辑:似乎有些人忽略了这一点.我不这样做:
[Test]
public void AddTest()
{
db.Add(someData);
}
[Test]
public void GetTest()
{
db.Get(someData);
Assert.That(data was retrieved successfully);
}
Run Code Online (Sandbox Code Playgroud)
相反,我这样做:
[Test]
public void AddTest()
{
db.Add(someData);
}
[Test]
public void GetTest()
{
// need some way here to ensure that db.Add() can actually be performed successfully
db.Add(someData);
db.Get(somedata);
Assert.That(data was retrieved successfully);
}
Run Code Online (Sandbox Code Playgroud)
换句话说,我想确保在我可以测试是否可以检索数据之前首先添加数据.人们假设我使用第一次测试的数据来通过第二次测试,但事实并非如此.我正在尝试确保在尝试依赖它的另一个操作之前可以执行一个操作.
正如我已经说过的,您需要确保在运行数据库操作之前可以连接到数据库.或者您可以在执行文件操作之前打开文件.或者在测试API调用之前连接到服务器.或者......你明白了.
我有一个Student对象:
public class Student
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
一个Classroom对象:
public class Classroom
{
public List<Student> Students { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想使用AutoMapper将学生列表转换为学生ID列表:
public class ClassroomDTO
{
public List<int> StudentIds { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
如何配置AutoMapper以执行此转换?
为了扩展我的问题和Jimmy的答案,这就是我最终做的事情:
Mapper.CreateMap<Student, int>().ConvertUsing(x => x.Id);
Mapper.CreateMap<Classroom, ClassroomDTO>()
.ForMember(x => x.StudentIds, y => y.MapFrom(z => z.Students));
Run Code Online (Sandbox Code Playgroud)
AutoMapper非常聪明,可以完成剩下的工作.
我正在使用NHibernate来持久保存这个实体:
public class Store
{
public int Id { get; protected set; }
public int Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
请注意该Id属性如何具有受保护的setter.这是为了防止用户更改Idwhile仍然允许NHibernate在将Id其保存到数据库时分配它.
在我的一个单元测试中,我使用Moq和以下代码来模拟我的存储库:
var mock = new Mock<IRepository>();
mock.Setup(x => x.GetById<Store>(It.IsAny<int>()))
.Returns(new Store { Value = "Walmart" }); // can't set the ID here
var store = Repository.GetById<Store>(5);
Assert.That(store.Id == 5);
Run Code Online (Sandbox Code Playgroud)
当我告诉Moq返回一个新Store实例时,我无法分配ID,并且单元测试失败.我该如何对这个属性进行单元测试?我不想更改属性的访问级别,因为我不希望用户手动更改它,但这正是我必须要做的,以便测试它.
在ASP.NET MVC 3 RC2中,默认的ModelBinder将自动解析请求正文(如果Content-Type设置为)application/json.问题是,这留下Request.InputStream了流的末尾.这意味着如果您尝试使用自己的代码读取输入流,则首先将其重置为开头:
// client sends HTTP request with Content-Type: application/json and a JSON
// string in the body
// requestBody is null because the stream is already at the end
var requestBody = new StreamReader(Request.InputStream).ReadToEnd();
// resets the position back to the beginning of the input stream
var reader = new StreamReader(Request.InputStream);
reader.BaseStream.Position = 0;
var requestBody = reader.ReadToEnd();
Run Code Online (Sandbox Code Playgroud)
因为我正在使用Json.NET序列化/反序列化,所以我想禁用默认的ModelBinder进行额外的解析.有没有办法做到这一点?
在C#中,我创建了静态方法来帮助我执行简单的操作.例如:
public static class StringHelper
{
public static string Reverse(string input)
{
// reverse string
return reversedInput;
}
}
Run Code Online (Sandbox Code Playgroud)
然后在控制器中,我会通过简单地使用:
StringHelper.Reverse(input);
Run Code Online (Sandbox Code Playgroud)
现在我正在使用ColdFusion和Model Glue,我想做同样的事情.但是,似乎ColdFusion中没有静态方法的概念.如果我像这样创建一个CFC:
component StringHelper
{
public string function Reverse(string input)
{
// reverse string
return reversedInput;
}
}
Run Code Online (Sandbox Code Playgroud)
我是否可以通过StringHelper在控制器中创建实例来调用此方法,如下所示:
component Controller
{
public void function Reverse()
{
var input = event.getValue("input");
var stringHelper = new StringHelper();
var reversedString = stringHelper.Reverse(input);
event.setValue("reversedstring", reversedString);
}
}
Run Code Online (Sandbox Code Playgroud)
或者在某些地方我可以放置"静态"CFC,框架将在后台创建一个实例,这样我就可以使用它,好像它是静态的,有点像helpers文件夹的工作方式?
c# ×6
asp.net-mvc ×3
automapper ×3
nhibernate ×2
nunit ×2
unit-testing ×2
cascade ×1
coldfusion ×1
coldfusion-9 ×1
dynamic ×1
flatten ×1
image ×1
modelbinders ×1
moq ×1
ninject ×1
poco ×1
resize ×1
static ×1
subclass ×1
validation ×1
viewmodel ×1