gpt4 book ai didi

c# - 根据行类型将父子表映射到其他表

转载 作者:太空宇宙 更新时间:2023-11-03 11:57:52 25 4
gpt4 key购买 nike

我们有一个父子层次结构,每个项目类型(最多 100 种类型)都有额外的表和字段。

FOREIGN_KEY TBL_COM_RELATION 中的列引用数据表中的记录。现在我们想通过 ASP.NET Core 上的 Entity Framework 访问表。

这些是我在 SQL Server 数据库上创建的表:

TBL_COM_RELATION

enter image description here

TBL_COM_TYPE

enter image description here

TBL_DATA_CUSTOMER

enter image description here

TBL_DATA_ORDER

enter image description here

C# 中的模型:

Model.ComRelation

[Table("TBL_COM_RELATION", Schema = "dyn")]
public class ComRelation
{
[Key]
public Guid ID
{
get; set;
}

public int? FOREIGN_KEY
{
get; set;
}

public int TYPE_ID
{
get; set;
}

public virtual ComType ComType
{
get; set;
}

public Guid PARENT_ID
{
get; set;
}

public virtual ComRelation Parent
{
get; set;
}

[ForeignKey("ID")]
public virtual ICollection<ComRelation> Children
{
get; set;
}
}

Model.ComType

[Table("TBL_COM_TYPE", Schema = "dyn")]
public class ComType
{
[Key]
public int TYPE_ID
{
get; set;
}

public string DESC
{
get; set;
}

public string TARGET_TABLE
{
get; set;
}

public string TARGET_CLASS
{
get; set;
}

public string TBL_FOREIGN_KEY
{
get; set;
}
}

Model.Customer

[Table("TBL_DATA_CUSTOMER", Schema = "dyn")]
public class Customer
{
[Key]
public int CUST_ID
{
get; set;
}

public string Name
{
get; set;
}

public string Street
{
get; set;
}

public string City
{
get; set;
}
}

Model.Order

[Table("TBL_DATA_ORDER", Schema = "dyn")]
public class Order
{
[Key]
public int ORDER_ID
{
get; set;
}

public string Description
{
get; set;
}
}

是否可以使用 DbSet<ComRelation>并根据项目类型动态继承?

最佳答案

“继承”或动态构建基于表外数据的关系是不可能的。但是,您可以实现通用方法并根据已知类型检索相关对象。

public T GetObject<T>(int id)
{
return context.DbSet<T>.Find(id);
}

用法:

public object GetRelatedObject(Guid relationId)
{
var relationType = context
.DbSet<ComRelation>
.Join(context.DbSet<ComType>, r => r.TYPE_ID, t => t.TYPE_ID, (r, t) => new { Relation = r, Type = t })
.Where(r => r.ID = relationId)
.FirstOrDefault();

Type objectType = Type.GetType(relationType.Type.TARGET_CLASS, "Namespace"),
contextType = context.GetType();

var method = contextType.GetMethods()
.Where(m => m.Name == "GetObject" && m.IsGenericMethodDefinition)
.FirstOrDefault()
.MakeGenericMethod(objectType);

return method.Invoke(contextType, new object[] { relationType.Relation.FOREIGN_KEY });
}

GetRelatedObject 方法将返回类型为 CustomerOrder 的对象,您需要对其进行相应处理。

HTH

关于c# - 根据行类型将父子表映射到其他表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58835427/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com