EF中,如何获取一个实体所对应的数据表名?

时间:2022-02-14 12:22:21
比如实体这么定义的:
public class A_Abc

或者这么定义的:
[Table("A_Abc")]
public class Abc

以上,我想得到"A_Abc"的字符串,即实体对应的表名,怎么办? 谢谢!

11 个解决方案

#1


Abc.GetAttribute("Table").Value
A_Abc.GetType().GetClassName 

#2


得到真正的数据库表的名称,用Metadata获取(假如你程序的表名和你数据库表名不一样呢)
参考 http://www.cnblogs.com/Allen-Li/archive/2012/04/25/2470157.html

#3


本帖最后由 q107770540 于 2013-03-07 09:44:59 编辑

using System.Data.Linq.Mapping;

class Program
    {
        static void Main(string[] args)
        {
            string name = typeof(Abc).GetAttributeValue((TableAttribute dna) => dna.Name);
            Console.WriteLine(name);
            
            Console.Read();
        }
    }

    public static class AttributeExtensions
    {
        public static TValue GetAttributeValue<TAttribute, TValue>(
            this Type type,
            Func<TAttribute, TValue> valueSelector)
            where TAttribute : Attribute
        {
            var att = type.GetCustomAttributes(
                typeof(TAttribute), true
            ).FirstOrDefault() as TAttribute;
            if (att != null)
            {
                return valueSelector(att);
            }
            return default(TValue);
        }
    }

    [Table(Name = "MyAbc")]
    public class Abc
    {
    }

#4


引用 3 楼 q107770540 的回复:
本帖最后由 q107770540 于 2013-03-07 09:44:59 编辑
            C# code?1234567891011121314151617181920212223242526272829303132333435using System.Data.Linq.Mapping; class Program    {        st……

正解,反射,取attribute,不但可以取表名,而且可以取任何attribute。

#5


引用 3 楼 q107770540 的回复:
本帖最后由 q107770540 于 2013-03-07 09:44:59 编辑
            C# code?1234567891011121314151617181920212223242526272829303132333435using System.Data.Linq.Mapping; class Program    {        st……


试过了,这种对于定义了:[Table(Name = "MyAbc")]这种类可能有效,但对于DataBaseFirst方式,即采用edmx中定义的类,无法取到Table属性。
继续求解……

#6


EF中,如何获取一个实体所对应的数据表名?反射

#7


在Map类里面,设置this.ToTable("A_Abc"); 就可以

#8


如果是自定义了 TableAttribute属性,用反射即可获取。
如果是DataBaseFirst,就只能通过Edmx的MetaData来获取了

#9


引用 8 楼 a157147899 的回复:
如果是自定义了 TableAttribute属性,用反射即可获取。
如果是DataBaseFirst,就只能通过Edmx的MetaData来获取了

对,我就是想这样,然后做成一个通用的方法,即根据类取表名,如果有TableAttribute,就用反射取,没有,则判断为DatabaseFirst方式,通过Edmx的MetaData取……
有无取MetaData数据的具体代码?谢谢

#10


引用 9 楼 wapit 的回复:
引用 8 楼 a157147899 的回复:如果是自定义了 TableAttribute属性,用反射即可获取。
如果是DataBaseFirst,就只能通过Edmx的MetaData来获取了
对,我就是想这样,然后做成一个通用的方法,即根据类取表名,如果有TableAttribute,就用反射取,没有,则判断为DatabaseFirst方式,通过Edmx的MetaDa……


2楼版主给的链接就是具体代码了
http://www.cnblogs.com/Allen-Li/archive/2012/04/25/2470157.html 
这个博主是在微软中国做EF技术支持的。

#11


public static void Main()
{
//获取当前执行代码的程序集
Assembly assem = Assembly.GetExecutingAssembly();

Console.WriteLine("程序集全名:"+assem.FullName);
Console.WriteLine("程序集的版本:"+assem.GetName().Version);
Console.WriteLine("程序集初始位置:"+assem.CodeBase);
Console.WriteLine("程序集位置:"+assem.Location);
Console.WriteLine("程序集入口:"+assem.EntryPoint);

Type[] types = assem.GetTypes();
Console.WriteLine("程序集下包含的类型:");
foreach (var item in types)
{
Console.WriteLine("类:"+item.Name);
}
}

上这里看看http://www.cnblogs.com/lmfeng/archive/2011/08/11/2134863.html

#1


Abc.GetAttribute("Table").Value
A_Abc.GetType().GetClassName 

#2


得到真正的数据库表的名称,用Metadata获取(假如你程序的表名和你数据库表名不一样呢)
参考 http://www.cnblogs.com/Allen-Li/archive/2012/04/25/2470157.html

#3


本帖最后由 q107770540 于 2013-03-07 09:44:59 编辑

using System.Data.Linq.Mapping;

class Program
    {
        static void Main(string[] args)
        {
            string name = typeof(Abc).GetAttributeValue((TableAttribute dna) => dna.Name);
            Console.WriteLine(name);
            
            Console.Read();
        }
    }

    public static class AttributeExtensions
    {
        public static TValue GetAttributeValue<TAttribute, TValue>(
            this Type type,
            Func<TAttribute, TValue> valueSelector)
            where TAttribute : Attribute
        {
            var att = type.GetCustomAttributes(
                typeof(TAttribute), true
            ).FirstOrDefault() as TAttribute;
            if (att != null)
            {
                return valueSelector(att);
            }
            return default(TValue);
        }
    }

    [Table(Name = "MyAbc")]
    public class Abc
    {
    }

#4


引用 3 楼 q107770540 的回复:
本帖最后由 q107770540 于 2013-03-07 09:44:59 编辑
            C# code?1234567891011121314151617181920212223242526272829303132333435using System.Data.Linq.Mapping; class Program    {        st……

正解,反射,取attribute,不但可以取表名,而且可以取任何attribute。

#5


引用 3 楼 q107770540 的回复:
本帖最后由 q107770540 于 2013-03-07 09:44:59 编辑
            C# code?1234567891011121314151617181920212223242526272829303132333435using System.Data.Linq.Mapping; class Program    {        st……


试过了,这种对于定义了:[Table(Name = "MyAbc")]这种类可能有效,但对于DataBaseFirst方式,即采用edmx中定义的类,无法取到Table属性。
继续求解……

#6


EF中,如何获取一个实体所对应的数据表名?反射

#7


在Map类里面,设置this.ToTable("A_Abc"); 就可以

#8


如果是自定义了 TableAttribute属性,用反射即可获取。
如果是DataBaseFirst,就只能通过Edmx的MetaData来获取了

#9


引用 8 楼 a157147899 的回复:
如果是自定义了 TableAttribute属性,用反射即可获取。
如果是DataBaseFirst,就只能通过Edmx的MetaData来获取了

对,我就是想这样,然后做成一个通用的方法,即根据类取表名,如果有TableAttribute,就用反射取,没有,则判断为DatabaseFirst方式,通过Edmx的MetaData取……
有无取MetaData数据的具体代码?谢谢

#10


引用 9 楼 wapit 的回复:
引用 8 楼 a157147899 的回复:如果是自定义了 TableAttribute属性,用反射即可获取。
如果是DataBaseFirst,就只能通过Edmx的MetaData来获取了
对,我就是想这样,然后做成一个通用的方法,即根据类取表名,如果有TableAttribute,就用反射取,没有,则判断为DatabaseFirst方式,通过Edmx的MetaDa……


2楼版主给的链接就是具体代码了
http://www.cnblogs.com/Allen-Li/archive/2012/04/25/2470157.html 
这个博主是在微软中国做EF技术支持的。

#11


public static void Main()
{
//获取当前执行代码的程序集
Assembly assem = Assembly.GetExecutingAssembly();

Console.WriteLine("程序集全名:"+assem.FullName);
Console.WriteLine("程序集的版本:"+assem.GetName().Version);
Console.WriteLine("程序集初始位置:"+assem.CodeBase);
Console.WriteLine("程序集位置:"+assem.Location);
Console.WriteLine("程序集入口:"+assem.EntryPoint);

Type[] types = assem.GetTypes();
Console.WriteLine("程序集下包含的类型:");
foreach (var item in types)
{
Console.WriteLine("类:"+item.Name);
}
}

上这里看看http://www.cnblogs.com/lmfeng/archive/2011/08/11/2134863.html