Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架,以任何实体作为参数的方法(如何使代码更通用)_C#_Entity Framework_Generic Programming - Fatal编程技术网

C# 实体框架,以任何实体作为参数的方法(如何使代码更通用)

C# 实体框架,以任何实体作为参数的方法(如何使代码更通用),c#,entity-framework,generic-programming,C#,Entity Framework,Generic Programming,我有一个将上下文和实体对象作为参数的方法。 此方法应该能够确定任何类(表)的公共属性(代码中的COID)是否有值 我找不到重写此代码的方法,因此它更通用,目前我正在检查传递给该方法的每个实体的类型 public async static Task<bool> IsCOIDAssigned(ProjectEntities _context, object _entity) { var bSuccess = false; //First

我有一个将上下文和实体对象作为参数的方法。 此方法应该能够确定任何类(表)的公共属性(代码中的COID)是否有值

我找不到重写此代码的方法,因此它更通用,目前我正在检查传递给该方法的每个实体的类型

    public async static Task<bool> IsCOIDAssigned(ProjectEntities _context, object _entity)
    {
        var bSuccess = false;

        //First type to check
        if (_entity is tblLine)
        {
            var _line = _entity as tblLine;
            await _context.Entry(_entity).ReloadAsync().ContinueWith(x =>
            {
                if (!x.IsFaulted)
                {
                    var query = from c in _context.tblLines
                                where c.ID.Equals(_line.ID)
                                select c;
                    if(query.Single().COID.GetValueOrDefault() == 0)
                    {
                        Console.WriteLine("Not assigned");
                        bSuccess = true;
                    }  
                    else
                    {
                        Console.WriteLine("Assigned");
                        bSuccess = false;
                    }
                }
                else
                {
                    bSuccess = false;
                }
            }, TaskScheduler.FromCurrentSynchronizationContext());
        };

        //Second type to check
        if (_entity is tblDevice)
        {
            var _device = _entity as tblDevice;
            await _context.Entry(_entity).ReloadAsync().ContinueWith(x =>
            {
                if (!x.IsFaulted)
                {
                    var query = from c in _context.tblDevices
                                where c.ID.Equals(_device.ID)
                                select c;

                    if (query.Single().COID.GetValueOrDefault() == 0)
                    {
                        Console.WriteLine("Not assigned");
                        bSuccess = true;
                    }
                    else
                    {
                        Console.WriteLine("Assigned");
                        bSuccess = false;
                    }
                }
                else
                {
                    bSuccess = false;
                }

            }, TaskScheduler.FromCurrentSynchronizationContext());
        };


        //Third type to check ....
        //Fourth type to check ....

        return bSuccess;
    }
公共异步静态任务已分配(项目实体\u上下文,对象\u实体)
{
var bSuccess=假;
//要检查的第一个类型
如果(_实体为tblLine)
{
var _line=_实体为特百林;
wait\u context.Entry(\u entity).ReloadAsync().ContinueWith(x=>
{
如果(!x.IsFaulted)
{
var query=来自c in_context.tbillines
其中c.ID等于(_line.ID)
选择c;
if(query.Single().COID.getValuerDefault()=0)
{
控制台。写入线(“未分配”);
b成功=真;
}  
其他的
{
控制台。写入线(“指定”);
b成功=错误;
}
}
其他的
{
b成功=错误;
}
},TaskScheduler.FromCurrentSynchronizationContext());
};
//要检查的第二种类型
如果(实体为TBL设备)
{
var _设备=_实体作为TBL设备;
wait\u context.Entry(\u entity).ReloadAsync().ContinueWith(x=>
{
如果(!x.IsFaulted)
{
var query=来自_context.tblDevices中的c
其中c.ID等于(_device.ID)
选择c;
if(query.Single().COID.getValuerDefault()=0)
{
控制台。写入线(“未分配”);
b成功=真;
}
其他的
{
控制台。写入线(“指定”);
b成功=错误;
}
}
其他的
{
b成功=错误;
}
},TaskScheduler.FromCurrentSynchronizationContext());
};
//要检查的第三种类型。。。。
//要检查的第四种类型。。。。
返回b成功;
}

有人找到了更好的解决方案吗?

您可以为tblLine和tblDevice创建至少包含属性COID和Id的基本抽象类

public abstract class TblBase
{
    public int Id { get; set; }

    public int COID { get; set; }

    //other common properties
}

public class TblLine : TblBase
{
    // properties
}

public class TblDevice : TblBase
{
    // properties
}
因此,在您的环境中,您将有:

public DbSet<TblBase> TblBases { get; set; }
public DbSet tblbase{get;set;}
对于这两个类,必须将继承设置为TPC(每个具体类型的表):

modelBuilder.Entity<TblLine>().Map(m =>
{
    m.MapInheritedProperties();
    m.ToTable("tblLines");
});

modelBuilder.Entity<TblDevice>().Map(m =>
{
    m.MapInheritedProperties();
    m.ToTable("tblDevices");
});
modelBuilder.Entity().Map(m=>
{
m、 MapInheritedProperties();
m、 ToTable(“第比利斯”);
});
modelBuilder.Entity().Map(m=>
{
m、 MapInheritedProperties();
m、 易变(“TBL设备”);
});

然后,您可以使用context.tblBase来查询数据。

我遵循了阿雷克兹拉的解决方案,在heret-tblBase中创建了我的表。 然而,由于我有一个数据库优先模型,所以无法通过代码修改我的模型(不确定这是否可行?)

多亏了arekzyla,我成功地得到了我想要的东西,但由于涉及的linq查询较少,我将实体转换为TblBase,它是一个包含ID和COID(公共表属性)的类

公共静态异步任务IsEntityCheckDout(项目实体\u上下文,对象\u实体)
{
var bCheckedOut=假;
wait\u context.Entry(\u entity).ReloadAsync().ContinueWith(x=>
{
如果(!x.IsFaulted)
{
var _baseentity=_实体作为TblBase;
如果(_baseentity.COID.GetValueOrDefault()!=0)
{
控制台。写入线(“指定”);
bCheckedOut=真;
}
其他的
{
控制台。写入线(“未分配”);
}
}
},TaskScheduler.FromCurrentSynchronizationContext());
返回bCheckedOut;
}

为什么不选择ID而不是实体?您所需要的只是集合和ID。只需将它们作为参数传递,就可以了。因为我传递的实体可以来自不同的表。因此,我不知道如何编写通用方法。此外,ID参数仅在我针对特定表时才可访问。
COID
是您实体的通用属性吗?此外,如果ID是主键,我认为最好使用_dbSet.Find(ID),这将在主键上搜索。是的,每个实体都有一个COID(签出ID)嗨,arekyla,我感谢您的回答。它帮助我找到了另一个解决办法。因为我没有遵循代码优先的方法,所以我似乎无法手动更改模型。@Pieterkii我认为当您使用数据库优先的方法时,它也应该工作,因为模型没有更改(所有属性都相同),类映射到具体的表,并且只有查询是不同的。尝试使用_context.TblBase时会出现异常。其中(linq表达式)“实体类型TblBase不是当前上下文的模型的一部分。”@Pieterkii您是否在ModelCreating(DbModelBuilder modelBuilder)上添加了到受保护覆盖void的映射?@arekylza是的,我在其他映射之上也添加了以下内容:modelBuilder.Entity().ToTable(“TblBase”);
public static async Task<bool> IsEntityCheckedOut(ProjectEntities _context, object _entity)
    {
        var bCheckedOut = false;
        await _context.Entry(_entity).ReloadAsync().ContinueWith(x =>
        {
            if (!x.IsFaulted)
            {
                var _baseentity = _entity as TblBase;
                if (_baseentity.COID.GetValueOrDefault() != 0)
                {
                    Console.WriteLine("Assigned");
                    bCheckedOut = true;
                }
                else
                {
                    Console.WriteLine("Not Assigned");
                }
            }
        }, TaskScheduler.FromCurrentSynchronizationContext());
        return bCheckedOut;
    }