小编use*_*426的帖子

在Entity Framework中将对象类型属性映射到varbinary(MAX)

我有一种情况,我有一个类型属性的类型object,例如.

public class MyType
{
   public virtual object MyProp{get; get;}
}
Run Code Online (Sandbox Code Playgroud)

这种类型必须是:

  1. 保存使用Entity Framework到数据库,作为byte[](我已经想到了序列化逻辑)
  2. 通过WCF传输(我将使用该KnownType属性)

如何映射我的object属性,确保将其转换为字节数组进行存储?

注意:该object属性将是一个值类型(非复杂)

我想创建一个单独的类型来保存到数据库,例如:

public class MyTypeEntity
{
   public virtual byte[] MyProp{get; get;}
}
Run Code Online (Sandbox Code Playgroud)

如何在仍然能够定义关系映射的同时在类型之间进行转换/转换?

这是否涉及对储蓄的某种拦截?

我能想到的最好的解决方案就是将序列化数据存储在数据库中.

如果property covariance在C#中有某种形式,也许这会更容易.据我所知,它不存在.如果有一个我可以使用的优雅替代品,我将非常感谢您的见解.

c# wcf entity-framework ef-fluent-api

9
推荐指数
1
解决办法
2万
查看次数

Redis键未到期 - Laravel,Predis

我正在使用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 :)

php redis laravel predis

8
推荐指数
4
解决办法
8271
查看次数

更新EF 6中的现有数据会引发异常 - "...相同类型的实体已具有相同的主键值".

我正在尝试使用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)

我一直收到错误:

附加类型的实体失败,因为相同类型的另一个实体已具有相同的主键值.如果图中的任何实体具有冲突的键值,则在使用"附加"方法或将实体的状态设置为"未更改"或"已修改"时,可能会发生这种情况.这可能是因为某些实体是新的并且尚未收到数据库生成的键值.在这种情况下,使用"添加"方法或"已添加"实体状态来跟踪图形,然后根据需要将非新实体的状态设置为"未更改"或"已修改".

我尝试过以下方法:

  1. 在设置之前附加 EntityState.Modified
  2. 添加AsNoTracking()查询对象是否存在(没有例外,但DB没有更新) - /sf/answers/1625960101/
  3. 使用基本实体_dbContext.Users而不是Employee实体进行保存 - /sf/answers/1790294411/

现在这些都不适合我.

对于那些不能在我的情况下工作的解决方案,我有什么问题?

c# entity-framework entity-framework-6

7
推荐指数
2
解决办法
2万
查看次数

asp.net mvc应用程序中的工作单元模式

我一直在关注这个名为"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.

c# nhibernate asp.net-mvc unit-of-work

6
推荐指数
1
解决办法
3001
查看次数

使用 SSH.Net 下载并返回非阻塞数据流

我正在使用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),可以处理大文件?

c# streaming sftp ssh.net

6
推荐指数
1
解决办法
3219
查看次数

何时以及为什么在使用BouncyCastle时使用ArmoredOutputStream装饰OutputStream

我对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)

java encryption bouncycastle pgp openpgp

5
推荐指数
2
解决办法
3952
查看次数

ORM和构造函数

我正在研究.NET ORM实现,我有一个主要的问题 - 是否有任何.NET ORM实现不需要数据库中每个字段的公共属性?当我看到这样的例子这样,一个小铃在我的头上熄灭.我坚信封装,并被迫打开我的对象的和服,只是为了使它们与持久性框架很好地工作,给了我heebie-jeebies.所有ORM都需要这种可访问性吗?如果没有,指出那些不需要它的例子!

.net orm

4
推荐指数
1
解决办法
248
查看次数

在 Laravel 中,为什么“你应该只将东西绑定到服务容器中,而不要尝试注册其他任何东西......”

当我发布此内容时,我确实看到了 SO 警告The question you're asking appears subjective and is likely to be closed

我继续发布它,因为它来自权威来源......这是实际的Laravel 文档

我问他们的意思是什么,以及可以为所给出的警告提供哪些示例(见下文)。

我正在阅读有关服务提供商的文档,发现以下内容:

写作服务提供商

所有服务提供者都扩展 Illuminate\Support\ServiceProvider 类。大多数服务提供者都包含寄存器和引导方法。在注册方法中,您应该只将事物绑定到服务容器中。您永远不应该尝试在 register 方法中注册任何事件侦听器、路由或任何其他功能。

来源在这里

没有给出例子,我不太明白他们的说法是什么意思。

答案可能已经在其他地方得到了回答,在这种情况下,我很抱歉,因为我没有找到它。

他们的意思是什么?您能举例说明什么是不应该做的吗?

php service-provider laravel

2
推荐指数
1
解决办法
613
查看次数

NHibernate - 使用抽象基础来提供功能而不是接口是否可以?

我对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)

nhibernate inheritance interface

1
推荐指数
1
解决办法
1100
查看次数

OData - 如何查询大于或等于给定值的 DateTime

我正在尝试在 OData 服务中查询日期时间大于或等于给定值的数据。它没有按预期工作

我已阅读文档:

https://learn.microsoft.com/en-us/odata/webapi/datetime-support#filter-datetime

组件

  • 微软.AspNetCore.OData 7.4.0
  • 网络核心3
  • EF核心

重现步骤

我尝试过以下查询格式:

  1. https://myurl/api/resource?$filter=city eq 'Kigali' and purchaseDateTime gt 2020-01-01T23:59:59.99Z &$orderby=purchaseDateTime desc HTTP 500 - 从字符串转换日期和/或时间时转换失败。

  2. 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 - 内部服务器错误

  3. https://myurl/api/resource?$filter=city eq 'Kigali' and purchaseDateTime gt datetime'2020-01-01T23:59:59.99Z' &$orderby=purchaseDateTime desc

在 OData 网站上,这有效

https://services.odata.org/V4/OData/OData.svc/Products?$filter=ReleaseDate%20gt%202002-12-30T23:59:59.99Z

预期结果

根据查询返回数据,与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. 使用 ODATA 过滤 x 和 y 之间的日期
  2. ODATA日期查询 …

c# datetime odata asp.net-core-webapi

1
推荐指数
1
解决办法
2万
查看次数

选择"发生"的记录更有效 - 从另一条记录中的日期的00:00:00到23:59:59,在同一个JOIN中

我想获取给定日期/ 1天间隔的记录数据.

这意味着来自00:00:0023:59:59那一天.日期值来自连接语句中的另一个表...即,它不是参数.

假设我有一个TransactionsDateOccured(Datetime)字段的表

根据我的研究,我有两种可能的选择(其中包括).

  1. 计算当天的日期时间范围值

    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子句中)

  1. 转换Datetime为日期然后附加适当的字符串(对于时间部分)来创建范围(似乎没有效率)

哪个是最好的策略?

我会将此计算放在SELECT列表中并用作WHERE?中的字段吗?或者在WHERE条款中是否更好

sql t-sql sql-server sql-server-2008

0
推荐指数
1
解决办法
70
查看次数

在列表中填充集合

我认为我的LINQ查询语法是错误的.

以下是我要做的事情的简要介绍

  1. 我有一个人员列表(ICollection of Person)和一个地址列表(ICollection of Address)
  2. 一个人可以有多个地址.(因此一个Person有一个ICollection类型的Addresses属性)
  3. 每个地址还有一个PersonId,用于将其与Person关联
  4. 假设我有这两个集合,但Person集合没有填充地址,**我想填充地址集合...为什么下面的Linq不起作用?
  5. 它不会填充地址集合但不会引发错误
  6. 问题是,鉴于我有两个数据集合并且它们具有匹配类型,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# linq

-1
推荐指数
1
解决办法
147
查看次数