Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.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# 如何在Entity Framework 6中获取实体的主键字段和默认值?_C#_.net_Entity Framework - Fatal编程技术网

C# 如何在Entity Framework 6中获取实体的主键字段和默认值?

C# 如何在Entity Framework 6中获取实体的主键字段和默认值?,c#,.net,entity-framework,C#,.net,Entity Framework,我的数据库设计器没有为数据库中的主键字段使用标准的“Id”,因此我需要为我正在编写的通用存储库找到以下内容 主键名 主键CLR类型 主键CLR类型默认值 我正在尝试使用生成的脚手架代码(如下所示)创建一个通用存储库: public void InsertOrUpdate(Entity entity) { if (entity.EntityID == default(int)) { // New entity

我的数据库设计器没有为数据库中的主键字段使用标准的“Id”,因此我需要为我正在编写的通用存储库找到以下内容

  • 主键名
  • 主键CLR类型
  • 主键CLR类型默认值
我正在尝试使用生成的脚手架代码(如下所示)创建一个通用存储库:

    public void InsertOrUpdate(Entity entity)
    {
        if (entity.EntityID == default(int))
        {
            // New entity
            _context.Entry(entity).State = System.Data.Entity.EntityState.Added;
        }
        else
        {
            // Existing entity (TODO:  Wont add the whole graph of things)
            _context.Entry(entity).State = System.Data.Entity.EntityState.Modified;
        }
    }
我通过执行以下操作找到了主键名称:

    public string FindPrimaryKey()
{
    var objectSet = ((IObjectContextAdapter)_context).ObjectContext.CreateObjectSet<Entity>();
    string keyName = objectSet.EntitySet.ElementType.KeyMembers.Select(k => k.Name).FirstOrDefault();
    return keyName;
}
公共字符串FindPrimaryKey()
{
var objectSet=((IObjectContextAdapter)_context.ObjectContext.CreateObjectSet();
string keyName=objectSet.EntitySet.ElementType.KeyMembers.Select(k=>k.Name).FirstOrDefault();
返回键名;
}
我即将使用以下代码获得主键CLR类型:

  public string FindPrimaryKeyType()
        {
            var objectSet = ((IObjectContextAdapter)_context).ObjectContext.CreateObjectSet<Entity>();
            string keyType = objectSet.EntitySet.ElementType.KeyMembers.Select(k => k.TypeUsage.EdmType.FullName).FirstOrDefault();
            var keyType2 = from m in objectSet.EntitySet.ElementType.KeyMembers
                select m.TypeUsage.EdmType;
            return "";
        }
公共字符串FindPrimaryKeyType()
{
var objectSet=((IObjectContextAdapter)_context.ObjectContext.CreateObjectSet();
string keyType=objectSet.EntitySet.ElementType.KeyMembers.Select(k=>k.TypeUsage.EdmType.FullName).FirstOrDefault();
var keyType2=从objectSet.EntitySet.ElementType.KeyMembers中的m开始
选择m.TypeUsage.EdmType;
返回“”;
}
在调试上面的代码时,我可以看到ClrType,但我还没有弄清楚如何从ClrType获取类型:


所以,请帮助我找出如何获取ClrType,或者其他更好的方法

您已经获得了表示属性名称的键名称,只需使用反射来获取属性类型即可

var objectSet = ((IObjectContextAdapter)_context).ObjectContext.CreateObjectSet<Entity>();
var keyNames = objectSet.EntitySet.ElementType.KeyMembers.Select(k => k.Name).ToArray();
以获取默认值

var defaultValues = types.Select(type => type.IsValueType ? Activator.CreateInstance(type) : null).ToArray();
更新 把所有的东西都放在一节课上

public class EntityHelper<Entity> where Entity :class
{
    private DbContext _context;
    public EntityHelper(DbContext context)
    {
        _context = context;
    }
    public string[] FindPrimaryKeyNames()
    {
        var objectSet = ((IObjectContextAdapter)_context).ObjectContext.CreateObjectSet<Entity>();
        var keyNames = objectSet.EntitySet.ElementType.KeyMembers.Select(k => k.Name).ToArray();
        return keyNames;
    }
    public Type[] FindPrimaryKeyTypes()
    {
        var keyNames = FindPrimaryKeyNames();
        var types = keyNames.Select(keyName => typeof(Entity).GetProperty(keyName).PropertyType).ToArray();
        return types;
    }
    public object[] FindPrimaryKeyDefaultValues()
    {
        var types = FindPrimaryKeyTypes();
        var defaultValues = types.Select(type => type.IsValueType ? Activator.CreateInstance(type) : null).ToArray();
        return defaultValues;
    }
}
公共类EntityHelper,其中实体:类
{
私有DbContext _context;
公共EntityHelper(DbContext上下文)
{
_上下文=上下文;
}
公共字符串[]FindPrimaryKeyNames()
{
var objectSet=((IObjectContextAdapter)_context.ObjectContext.CreateObjectSet();
var keyNames=objectSet.EntitySet.ElementType.KeyMembers.Select(k=>k.Name.ToArray();
返回键名;
}
公共类型[]FindPrimaryKeyTypes()
{
var keyNames=FindPrimaryKeyNames();
var types=keyNames.Select(keyName=>typeof(Entity).GetProperty(keyName).PropertyType.ToArray();
返回类型;
}
公共对象[]FindPrimaryKeyDefaultValues()
{
变量类型=FindPrimaryKeyTypes();
var defaultValues=types.Select(type=>type.IsValueType?Activator.CreateInstance(type):null.ToArray();
返回默认值;
}
}

您已经获得了表示属性名称的键名称,只需使用反射来获取属性类型即可

var objectSet = ((IObjectContextAdapter)_context).ObjectContext.CreateObjectSet<Entity>();
var keyNames = objectSet.EntitySet.ElementType.KeyMembers.Select(k => k.Name).ToArray();
以获取默认值

var defaultValues = types.Select(type => type.IsValueType ? Activator.CreateInstance(type) : null).ToArray();
更新 把所有的东西都放在一节课上

public class EntityHelper<Entity> where Entity :class
{
    private DbContext _context;
    public EntityHelper(DbContext context)
    {
        _context = context;
    }
    public string[] FindPrimaryKeyNames()
    {
        var objectSet = ((IObjectContextAdapter)_context).ObjectContext.CreateObjectSet<Entity>();
        var keyNames = objectSet.EntitySet.ElementType.KeyMembers.Select(k => k.Name).ToArray();
        return keyNames;
    }
    public Type[] FindPrimaryKeyTypes()
    {
        var keyNames = FindPrimaryKeyNames();
        var types = keyNames.Select(keyName => typeof(Entity).GetProperty(keyName).PropertyType).ToArray();
        return types;
    }
    public object[] FindPrimaryKeyDefaultValues()
    {
        var types = FindPrimaryKeyTypes();
        var defaultValues = types.Select(type => type.IsValueType ? Activator.CreateInstance(type) : null).ToArray();
        return defaultValues;
    }
}
公共类EntityHelper,其中实体:类
{
私有DbContext _context;
公共EntityHelper(DbContext上下文)
{
_上下文=上下文;
}
公共字符串[]FindPrimaryKeyNames()
{
var objectSet=((IObjectContextAdapter)_context.ObjectContext.CreateObjectSet();
var keyNames=objectSet.EntitySet.ElementType.KeyMembers.Select(k=>k.Name.ToArray();
返回键名;
}
公共类型[]FindPrimaryKeyTypes()
{
var keyNames=FindPrimaryKeyNames();
var types=keyNames.Select(keyName=>typeof(Entity).GetProperty(keyName).PropertyType.ToArray();
返回类型;
}
公共对象[]FindPrimaryKeyDefaultValues()
{
变量类型=FindPrimaryKeyTypes();
var defaultValues=types.Select(type=>type.IsValueType?Activator.CreateInstance(type):null.ToArray();
返回默认值;
}
}

我不知道有任何直接方法可以将模型元数据公开的
EdmType
映射回本机.Net
类型。Yuliam提供了一种混合方法,可以切换到.Net refection来解析该类型

如果您想坚持使用实体框架元数据,您可以自己进行映射,如下面的代码示例所示。这是我的代码,灵感来自以下问题:

要获取类型的默认值,可以使用以下命令。同样,我所使用的代码最初取自以下问题:

然后按如下方式使用:

var objectContext = (context as IObjectContextAdapter).ObjectContext;
var entitySet = objectContext.CreateObjectSet<YOUR_ENTITY>().EntitySet;
var keys = entitySet.ElementType.KeyMembers.Select(k =>
{
    var type = GetTypedEdmValue(k.TypeUsage.EdmType);                    
    return new
    {
        KeyName = k.Name,
        KeyType = type,
        KeyDefaultValue = GetDefaultValue(type)

    };
}).ToList();
var-objectContext=(作为IObjectContextAdapter的上下文);
var entitySet=objectContext.CreateObjectSet().entitySet;
var keys=entitySet.ElementType.KeyMembers.Select(k=>
{
var type=GetTypedEdmValue(k.TypeUsage.EdmType);
还新
{
KeyName=k.Name,
KeyType=类型,
KeyDefaultValue=GetDefaultValue(类型)
};
}).ToList();

这只是为了示例而连接起来的,用于返回带有键名、类型和默认值的匿名类型列表。

我不知道有任何直接方法可以将模型元数据公开的
EdmType
映射回本机.Net
类型。Yuliam提供了一种混合方法,可以切换到.Net refection来解析该类型

var defaultValues = types.Select(type => type.IsValueType ? Activator.CreateInstance(type) : null).ToArray();
如果您想坚持使用实体框架元数据,您可以自己进行映射,如下面的代码示例所示。这是我的代码,灵感来自以下问题:

要获取类型的默认值,可以使用以下命令。同样,我所使用的代码最初取自以下问题:

然后按如下方式使用:

var objectContext = (context as IObjectContextAdapter).ObjectContext;
var entitySet = objectContext.CreateObjectSet<YOUR_ENTITY>().EntitySet;
var keys = entitySet.ElementType.KeyMembers.Select(k =>
{
    var type = GetTypedEdmValue(k.TypeUsage.EdmType);                    
    return new
    {
        KeyName = k.Name,
        KeyType = type,
        KeyDefaultValue = GetDefaultValue(type)

    };
}).ToList();
var-objectContext=(作为IObjectContextAdapter的上下文);
var entitySet=objectContext.CreateObjectSet().entitySet;
var keys=entitySet.ElementType.KeyMembers.Select(k=>
{
var type=GetTypedEdmValue(k.TypeUsage.EdmType);
还新
{
凯恩