首页 > 解决方案 > 实体框架 - 将一个类的记录插入另一个“相同”对象

问题描述

使用数据库优先实体框架。将记录插入我的一张表中,完全没有问题。然后我发现在某些非常罕见的情况下,我得到了重复的记录,这实际上是可以的。所以我处理这些问题的计划是创建一个相同的表,捕获异常,将副本放在同一个表中,并在稍后的某个阶段对其进行检查。

但是,我天真地认为它们是相同的表,我可以将我已经创建的对象插入到另一个“错误”表中,这显然是我做不到的(“无法从 'original_class' 转换为 'new_class'”) ,我理解。

那么有没有更好的方法来做我想要实现的目标,或者有没有一种简单的方法可以将我的“original_class”转换为我的“new_class”,因为它们是完全相同的?

***编辑认为为了清楚起见添加一些代码可能是有益的(不是我的实际代码,只是我想要实现的目标的表示)

我的交易类

public partial class Tran
{
    public string tranDescription
}

我的交易错误类

public partial class TranError
{
    public string tranDescription
}

我如何尝试处理错误

using(var db = new tranEntities())
{
    Tran t = new Tran();
    t.tranDescription = @"Some Description";
    try
    {
        db.Trans.Add(t);
    }
    catch (System.Data.Entity.Infrastructure.DbUpdateException)
    {
        db.TransError.Add(t);
    }
}

我只是在飞行中输入的,所以请原谅任何拼写错误,我想你明白了。

标签: c#entity-frameworkclass

解决方案


Tomislav 的答案的替代方案,如果您的项目使用 JSON,您可以使用 JSON 序列化切换相同的类型:

public static class SwapperExtensions
{
    public static T2 Swap<T1,T2>(this T1 original) where T1:class where T2:class,new()
    {
        if (original == null)
            return null;

        try
        {
            var result = JsonConvert.SerializeObject(original);
            var newObject = JsonConvert.DeserializeObject<T2>(result);
            return newObject;
        }
        catch(Exception ex)
        {
            throw new ArgumentException("The provided types could not be swapped. See inner exception for details.", ex);
        }
    }
}

然后看起来像:

var tran = new Tran { TranDescription = "Some description." };

// do stuff...

var tranError = tran.Swap<Tran, TranError>();

显然,如果使用不兼容的类型调用它,则在执行此类操作时需要防止异常。:)


推荐阅读