我有一种情况,我有一个类型属性的类型object,例如.
public class MyType
{
public virtual object MyProp{get; get;}
}
Run Code Online (Sandbox Code Playgroud)
这种类型必须是:
Entity Framework到数据库,作为byte[](我已经想到了序列化逻辑)KnownType属性)如何映射我的object属性,确保将其转换为字节数组进行存储?
注意:该object属性将是一个值类型(非复杂)
我想创建一个单独的类型来保存到数据库,例如:
public class MyTypeEntity
{
public virtual byte[] MyProp{get; get;}
}
Run Code Online (Sandbox Code Playgroud)
如何在仍然能够定义关系映射的同时在类型之间进行转换/转换?
这是否涉及对储蓄的某种拦截?
我能想到的最好的解决方案就是将序列化数据存储在数据库中.
如果property covariance在C#中有某种形式,也许这会更容易.据我所知,它不存在.如果有一个我可以使用的优雅替代品,我将非常感谢您的见解.
我正在使用Laravel 5.4,使用Predis和最新的Redis(或Redis for Windows).
密钥保存没有问题.所以,我怀疑这是一个配置问题.
问题是他们没有到期.密钥将重复使用,直到它过期...类似于会话的工作方式.
如果它不存在,我创建一次密钥.在同样的逻辑中,我然后设置到期时间.
在控制器中,我有
use Illuminate\Support\Facades\Redis;
Run Code Online (Sandbox Code Playgroud)
在其中一个函数中,获取连接实例:
$redis = Redis::connection();
Run Code Online (Sandbox Code Playgroud)
在创建密钥之前,我检查存在(简化)然后创建并设置到期.
if(!$redis->exists($some_unique_key))
{
//set the key
$redis->set($some_unique_key, 'Some Value'));
//set the expiration
//I understand this means expire in 60s.
$redis->expire($some_unique_key,60);
}
Run Code Online (Sandbox Code Playgroud)
为什么它不会到期钥匙?
正如我所提到的,其他一切都有效.如果我监视,我会看到密钥更新没有问题,并且可以查询它.
为了记录,我读过:
Laravel文档到期时没有任何内容:
更新1
调查设置(更新)密钥的可能原因会重置到期日
更新2
使用@ for_thestack的推理(在REDIS命令中)来提出解决方案.用代码查看我的回答.随意upvote @for_thestack :)
我正在尝试使用Entity Framework 6更新记录,代码优先,没有流畅的映射或像Automapper这样的工具.
entity(Employee)具有与之关联的其他复合属性,如Addreess(collection),Department
它也是从一个名为的基础继承的 User
save方法如下,_dbContext作为DbConext实现
public bool UpdateEmployee(Employee employee)
{
var entity = _dbContext.Employees.Where(c => c.Id == employee.Id).AsQueryable().FirstOrDefault();
if (entity == null)
{
_dbContext.Employees.Add(employee);
}
else
{
_dbContext.Entry(employee).State = EntityState.Modified; // <- Exception raised here
_dbContext.Employees.Attach(employee);
}
return _dbContext.SaveChanges() > 0;
}
Run Code Online (Sandbox Code Playgroud)
我一直收到错误:
附加类型的实体失败,因为相同类型的另一个实体已具有相同的主键值.如果图中的任何实体具有冲突的键值,则在使用"附加"方法或将实体的状态设置为"未更改"或"已修改"时,可能会发生这种情况.这可能是因为某些实体是新的并且尚未收到数据库生成的键值.在这种情况下,使用"添加"方法或"已添加"实体状态来跟踪图形,然后根据需要将非新实体的状态设置为"未更改"或"已修改".
我尝试过以下方法:
EntityState.ModifiedAsNoTracking()查询对象是否存在(没有例外,但DB没有更新) - /sf/answers/1625960101/_dbContext.Users而不是Employee实体进行保存 - /sf/answers/1790294411/现在这些都不适合我.
对于那些不能在我的情况下工作的解决方案,我有什么问题?
我一直在关注这个名为"NHibernate和工作单元模式"的优秀博客,并且有一个关于在asp.net mvc项目中使用UnitOfWork.Start的最佳位置的问题.
我的SLN分为以下几个项目: -
MVC project
Repository
NHibernateUnitOfWork
Run Code Online (Sandbox Code Playgroud)
我有一个界面: -
public interface INameRepository
...
IList<Name> GetByOrigin(int OriginId)
...
Run Code Online (Sandbox Code Playgroud)
我有一个具体的实现
public class NameRepository : INameRepository
...
public IList<Name> GetByOrigin(int OriginId) {
using (UnitOfWork.Start()) {
var query = session.Linq<...
return query;
}
}
...
Run Code Online (Sandbox Code Playgroud)
我的问题是我使用(UnitOfWork.Start())将所有方法包装在我的所有存储库中,还是有更好的方法?
我正在使用nHibernate,asp.net mvc.
我正在使用ssh.net 库执行 SFTP 操作来处理大型数据文件(>=500MB)
我遇到了如何以非阻塞方式返回数据的问题。
当写入文件时或者如果有某种方法可以实例化流时,方法ftpClient.DownloadFile()签名是可以的,但是当我想在不阻塞的情况下返回流时,我在如何使用它方面遇到了问题。
到目前为止我看到的所有示例都将下载内容写入Filestream. 没有什么只是返回流
使用 .Net 的内置 FTP,您只需使用response.GetResponseStream(),它就会无阻塞地传回数据。
在 return 语句中使用它的唯一方法是写入临时文件。但这会导致它成为阻塞操作。
var tmpFilename = "temp.dat";
int bufferSize = 4096;
var sourceFile = "23-04-2015.dat";
using (var stream = System.IO.File.Create(tmpFilename , bufferSize, System.IO.FileOptions.DeleteOnClose))
{
sftpClient.DownloadFile(sourceFile, stream);
return stream;
}
Run Code Online (Sandbox Code Playgroud)
我不希望它阻塞,而是流回数据。
我还想避免创建临时文件。
是否有其他实现可以使其流回数据?
或者是否有一个可以实例化的替代流(除了MemoryStream),可以处理大文件?
我对BouncyCastle和pgp很新.我在互联网上看过很多文章和样本.几乎每个加密样本都包含下面剪切的代码
if (armor)
out = new ArmoredOutputStream(out);
Run Code Online (Sandbox Code Playgroud)
似乎我的本地测试通过了护甲和无护甲.我用google搜索但发现很少有用,而ArmoredOutputStream的javadoc只显示这是基本的输出流.
那么有什么区别以及何时使用它?
完整的代码示例:
public static void encryptFile(String decryptedFilePath,
String encryptedFilePath,
String encKeyPath,
boolean armor,
boolean withIntegrityCheck)
throws Exception{
OutputStream out = new FileOutputStream(encryptedFilePath);
FileInputStream pubKey = new FileInputStream(encKeyPath);
PGPPublicKey encKey = readPublicKeyFromCollection2(pubKey);
Security.addProvider(new BouncyCastleProvider());
if (armor)
out = new ArmoredOutputStream(out);
// Init encrypted data generator
PGPEncryptedDataGenerator encryptedDataGenerator =
new PGPEncryptedDataGenerator(PGPEncryptedData.CAST5, withIntegrityCheck, new SecureRandom(),"BC");
encryptedDataGenerator.addMethod(encKey);
OutputStream encryptedOut = encryptedDataGenerator.open(out, new byte[BUFFER_SIZE]);
// Init compression
PGPCompressedDataGenerator compressedDataGenerator = new PGPCompressedDataGenerator(PGPCompressedData.ZIP);
OutputStream compressedOut = compressedDataGenerator.open(encryptedOut);
PGPLiteralDataGenerator …Run Code Online (Sandbox Code Playgroud) 我正在研究.NET ORM实现,我有一个主要的问题 - 是否有任何.NET ORM实现不需要数据库中每个字段的公共属性?当我看到这样的例子这样,一个小铃在我的头上熄灭.我坚信封装,并被迫打开我的对象的和服,只是为了使它们与持久性框架很好地工作,给了我heebie-jeebies.所有ORM都需要这种可访问性吗?如果没有,请指出那些不需要它的例子!
当我发布此内容时,我确实看到了 SO 警告The question you're asking appears subjective and is likely to be closed。
我继续发布它,因为它来自权威来源......这是实际的Laravel 文档。
我问他们的意思是什么,以及可以为所给出的警告提供哪些示例(见下文)。
我正在阅读有关服务提供商的文档,发现以下内容:
写作服务提供商
所有服务提供者都扩展 Illuminate\Support\ServiceProvider 类。大多数服务提供者都包含寄存器和引导方法。在注册方法中,您应该只将事物绑定到服务容器中。您永远不应该尝试在 register 方法中注册任何事件侦听器、路由或任何其他功能。
没有给出例子,我不太明白他们的说法是什么意思。
答案可能已经在其他地方得到了回答,在这种情况下,我很抱歉,因为我没有找到它。
他们的意思是什么?您能举例说明什么是不应该做的吗?
我对NHibernate相当新,并且在我的存储库类中遇到了一个奇怪的继承链问题.我一直在使用Gabriel Schenker的FAQ作为参考,并且按照他的例子,我一直在创建接口来定义"存储库"类中DAO操作的合同.我正在使用的数据模式相当广泛,过了一会儿我发现自己复制了很多代码.具体来说,在向基本接口添加通用"EntityType"参数后,Add,Update,Delete和"GetByID"方法完全相同.因此,例如,这将是存储库操作的最基本接口:
public interface IBasicRepository<EntityType> where EntityType : class
{
void Add(EntityType entity);
void Remove(EntityType entity);
void Update(EntityType entity);
EntityType GetByID<IDType>(IDType id);
}
Run Code Online (Sandbox Code Playgroud)
为简洁起见,我将从现在开始讨论Add方法.使用通用EntityType,实现都是相同的:
public void Add(EntityType entity)
{
using (ISession session = NHUtility.OpenSession())
{
using (ITransaction transaction = session.BeginTransaction())
{
session.Save(entity);
transaction.Commit();
}
}
}
Run Code Online (Sandbox Code Playgroud)
显然,重复键入相同的方法体(稍微改变类型)不仅令人讨厌,而且在我的书中设计不好.所以我创建了一个抽象基类,我将其称为RepositoryBase,它为Add()提供了实现.因为我使用的是抽象而不是接口,所以我为继承自RepositoryBase的类"打破了接口链",并且我也被迫做出任何派生抽象,即使使用接口看起来更"正确".使用这个蹩脚的小实体示例....
public class Entity1
{
public Guid ID { get; set; }
public String Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
......一个人不能这样做......
public interface IEntity1Repository : RepositoryBase<Entity1>
{
//Illegal!!!! Bad, naughty programmer!
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 OData 服务中查询日期时间大于或等于给定值的数据。它没有按预期工作
我已阅读文档:
https://learn.microsoft.com/en-us/odata/webapi/datetime-support#filter-datetime
组件:
重现步骤
我尝试过以下查询格式:
https://myurl/api/resource?$filter=city eq 'Kigali' and purchaseDateTime gt 2020-01-01T23:59:59.99Z &$orderby=purchaseDateTime desc HTTP 500 - 从字符串转换日期和/或时间时转换失败。
https://myurl/api/resource?$filter=city eq 'Kigali' and purchaseDateTime gt cast(2020-01-01T23:59:59.99Z,Edm.DateTimeOffset) &$orderby=purchaseDateTime desc 返回 HTTP 500 - 内部服务器错误
https://myurl/api/resource?$filter=city eq 'Kigali' and purchaseDateTime gt datetime'2020-01-01T23:59:59.99Z' &$orderby=purchaseDateTime desc
在 OData 网站上,这有效
预期结果
根据查询返回数据,与http://services.odata.org响应的方式相同
实际结果
HTTP 错误请求或 HTTP 500
微软表示这应该有效:
GET ~/Customers?$filter=Birthday lt cast(2015-04-01T04:11:31%2B08:00,Edm.DateTimeOffset)
GET ~/Customers?$filter=year(Birthday) eq 2010
Run Code Online (Sandbox Code Playgroud)
我尝试过的其他信息来源:
我想获取给定日期/ 1天间隔的记录数据.
这意味着来自00:00:00于23:59:59那一天.日期值来自连接语句中的另一个表...即,它不是参数.
假设我有一个Transactions带DateOccured(Datetime)字段的表
根据我的研究,我有两种可能的选择(其中包括).
计算当天的日期时间范围值
从 00:00:00
DateAdd(dd,DateDiff(dd,0,Transaction.DateOccured,0)
至 23:59:59
DateAdd(dd,1,DateAdd(ss,-1,CONVERT(DATE,Transaction.DateOccured))) - 第二天午夜前1秒
(这样做的几个选项,例如将其放在SELECT列表中或放在WHERE子句中)
Datetime为日期然后附加适当的字符串(对于时间部分)来创建范围(似乎没有效率)哪个是最好的策略?
我会将此计算放在SELECT列表中并用作WHERE?中的字段吗?或者在WHERE条款中是否更好
我认为我的LINQ查询语法是错误的.
以下是我要做的事情的简要介绍
问题是,鉴于我有两个数据集合并且它们具有匹配类型,Linq查询语法下面是否正确?
// people is an ICollection<Person>
// addressList is an ICollection<Address>
var query = from person in People
select new Person
{
Id = person.Id,
Name = person.Name,
adresses = (from address in addressList
where address.PersonId == person.Id
select address).ToList()
};
Run Code Online (Sandbox Code Playgroud)c# ×6
laravel ×2
nhibernate ×2
php ×2
.net ×1
asp.net-mvc ×1
bouncycastle ×1
datetime ×1
encryption ×1
inheritance ×1
interface ×1
java ×1
linq ×1
odata ×1
openpgp ×1
orm ×1
pgp ×1
predis ×1
redis ×1
sftp ×1
sql ×1
sql-server ×1
ssh.net ×1
streaming ×1
t-sql ×1
unit-of-work ×1
wcf ×1