假设我有一个具有一些属性的类和一些用于操作这些属性的方法:
public class PersonModel
{
public string Name { get; set; }
public string PrimaryPhoneNumber { get; set; }
public void LoadAccountInfo(AccountInfo accountInfo)
{
this.Name = accountInfo.Name;
}
public void LoadPhoneInfo(PhoneInfo phoneInfo)
{
this.PrimaryPhoneNumber = phoneInfo.PhoneNumber;
}
}
Run Code Online (Sandbox Code Playgroud)
典型用法是:
var model = new PersonModel();
model.LoadAccountInfo(accountInfo);
model.LoadPhoneInfo(phoneInfo);
Run Code Online (Sandbox Code Playgroud)
我认为将方法链接起来会很酷:
public PersonModel LoadAccountInfo(AccountInfo accountInfo)
{
this.Name = accountInfo.Name;
return this;
}
public PersonModel LoadPhoneInfo(PhoneInfo phoneInfo)
{
this.PrimaryPhoneNumber = phoneInfo.PhoneNumber;
return this;
}
Run Code Online (Sandbox Code Playgroud)
那么用法是:
var model = new PersonModel()
.LoadAccountInfo(accountInfo)
.LoadPhoneInfo(phoneInfo);
Run Code Online (Sandbox Code Playgroud)
但是我没有在每个可链接的方法中返回传入的PersonModel对象的修改"克隆".他们只是修改原始对象并返回它(为方便起见).对我来说,这会产生歧义,因为有人调用这些方法可能会认为它们是不可变的(即它们保持原始对象完整但返回修改后的对象).
这是否违反了关于流畅/可链接接口的任何最佳实践?
考虑到Fluent NHibernate已经有一段时间了,我认为已经有一本书可用,所以我在亚马逊和谷歌搜索,但没有流利的nhiberanet书籍.我是对还是书已经存在?
$cardQueryList = [];
foreach($cards as $cardName => $quantity) {
$cardQueryList[] = [
'username' => $user->username,
'card_uid' => $card->uid,
'have_quantity' => $quantity
];
}
Collection::insert($cardQueryList);
Run Code Online (Sandbox Code Playgroud)
即使行存在,上面的代码也会创建新行.如果行存在,我该怎么做才会更新.如果没有它会创建行?一个雄辩或流利的答案将是最佳的,但如果没有别的办法,我会对原始开放.
我想用单个查询进行批量更新/插入.不是每个记录的for循环查询.理想情况下,出于显而易见的原因,我想打一次数据库.
我也已经检查了以下链接:
如果不存在则插入新记录,如果存在则更新,laravel eloquent
以上工作适用于单个记录更新/插入.如果我使用for循环运行会非常慢.我正在寻找一个允许在单个查询中进行批量插入/更新的答案.
注意:我正在使用'username'和'card_uid'作为我的密钥.所以基本上当我找到一个带有所述用户名和card_uid的行时,我想更新相应的行.否则创建一个新行.
我正在使用Fluent NHibernate并有两个表;
客户[ID,名称,LanguageID]
语言[ID,描述]
我有一个具有以下属性的Customer实体; ID,名称,语言ID,语言
我想要做的是加入语言表以获取语言描述并将其放在客户实体的语言属性中.
我尝试过使用Join但我无法使用customer表上的LanguageID字段加入Languages表 - 它一直想要使用'ID'.
我的映射看起来像;
Table("Customers");
Not.LazyLoad();
Id(c => c.ID).GeneratedBy.Assigned();
Map(c => c.Name);
Map(c => c.LanguageID);
Join("Languages", join =>
{
join.KeyColumn("ID");
join.Map(prop => prop.Language).Column("Description");
});
Run Code Online (Sandbox Code Playgroud) 我有这个加入:
Return DB::table('volunteer')
->join('volunteer_volunteer_category', 'volunteer_volunteer_category.volunteer_id', '=', 'volunteer.id')
->select(array('*','volunteer.id AS link_id'))
->where('is_published', '=', 1)
Run Code Online (Sandbox Code Playgroud)
但不出所料地返回重复记录,所以我尝试使用distinct():
Return DB::table('volunteer')
->join('volunteer_volunteer_category', 'volunteer_volunteer_category.volunteer_id', '=', 'volunteer.id')
->select(array('*','volunteer.id AS link_id'))
->distinct()
->where('is_published', '=', 1)
Run Code Online (Sandbox Code Playgroud)
但我想distinct() 在一个特定的单个字段上使用,我可以在SQL中轻松完成.似乎distinct()不带参数,即我不能说distinct('volunteer.id').
任何人都可以指出我如何删除我的重复记录?我打赌这是我的另一个额头.
我正在使用apache的HttpClient(通过Fluent API).当我收到响应对象时,我首先做:
response.returnResponse().getStatusLine().getStatusCode()
Run Code Online (Sandbox Code Playgroud)
如果状态代码是4xx或5xx,我抛出异常,或者我返回内容:
response.returnContent().asBytes();
Run Code Online (Sandbox Code Playgroud)
这response是一个类型的对象Response.但是,当我运行这个时,我得到:
java.lang.IllegalStateException: Response content has been already consumed.
Run Code Online (Sandbox Code Playgroud)
我怎么能绕过这个?
我正在尝试映射没有标识符的视图,但是nhibernate仍会生成带有id列的sql(给我一个sql错误,因为db列中不存在ID列).也许我误解了Id()构造函数?
构造函数评论:
创建在域对象或数据库中的列中没有相应属性的Id.这主要用于只读访问和/或视图.默认为带有"增量"生成器的int标识.
public class PersonMapping : ClassMap<Person>
{
public PersonMapping()
{
Table("person");
ReadOnly();
Id();
Map(f => f.Name, "name");
}
}
Run Code Online (Sandbox Code Playgroud) **Table Order**
Id (PK)
NonUniqueId
**Table OrderLine**
Id (PK)
OrderNonUniqueId
Text
Run Code Online (Sandbox Code Playgroud)
我有一个遗留数据库,其中OrderLine通过非主键引用Order.订单行可能属于许多订单.
如何在HasMany上映射?
**OrderMap**
HasMany(x => x.OrderLines)
.KeyColumn("OrderNonUniqueId")
Run Code Online (Sandbox Code Playgroud)
(因为它使用主键Order.Id,所以不起作用)
我有以下扩展方法:
public static IFoo Foo(this IFluentApi api, Action action);
public static IFoo<TResult> Foo<TResult>(
this IFluentApi api, Func<TResult> func);
public static IBar Bar(this IFoo foo);
public static void FooBar(this IBar bar, Action action);
public static void FooBar<TResult>( // <- this one cannot work as desired
this IBar bar, Action<TResult> action);
Run Code Online (Sandbox Code Playgroud)
通用接口始终从其对应的非通用接口派生.
不幸的是,为了使这项工作:
api.Foo(x => ReturnLong())
.Bar()
.FooBar(x => ...); // x should be of type long
Run Code Online (Sandbox Code Playgroud)
我还需要实现以下扩展方法:
public static IBar<TResult> Bar<TResult> (this IFoo<TResult> foo);
Run Code Online (Sandbox Code Playgroud)
并将上述最后一个扩展方法更改为:
public static void FooBar<TResult>(
this IBar<TResult> …Run Code Online (Sandbox Code Playgroud) 所以,我得到了一些我需要序列化/反序列化的类,这些类也恰好是域对象(至少是一些'em),因此我希望它们没有任何属性或者不依赖于某个框架.
我在Json.NET中查看了Custom Converters,但是在使用方面它们看起来非常" 古老 ",而不是,因为我们现在有了泛型,并且实现流畅的界面并不难.所以在我走弱路线之前等等.
...我正在寻找什么(伪):
public class MyModel {
public int Id { get; set; }
public string Name { get; set; }
public SomeObj SomeObj { get; set; }
}
public class MyModelConverter : JsonConverter<MyModel> {
public JsonConverter() {
RuleFor(x => x.Id).Name("Identifier");
RuleFor(x => x.SomeObj).Name("Data")
.WithConverter(new SomeObjConverter());
RuleFor(x => x.Name).Ignore();
}
}
Run Code Online (Sandbox Code Playgroud)
在Json.NET中有类似的东西吗?我只是错过了一些东西吗?(顺便说一句,我不能为我的属性等使用不同的名称,因为模型基于第三方规范).