使用多个数据库表的 ASP.NET MVC 模型

Posted

技术标签:

【中文标题】使用多个数据库表的 ASP.NET MVC 模型【英文标题】:ASP.NET MVC model that uses more that one db table 【发布时间】:2012-06-27 03:10:15 【问题描述】:

我是使用 MVC 的新手,我正在尝试制作一个使用其他模型的模型。

假设我的数据库中有 2 个表,为了这个问题,我将它们称为 Table1 和 Table2。在我的 MVC 项目中,这些对应于 Model1 和 Model2。现在我想拥有这样的 Model 3:

public class Model3

    public Model1 model1  get; set; 
    public Model2 model2  get; set; 
    public string someString  get; set; 

我想使用如下所示的 T-SQL 查询创建:

SELECT * FROM Table1 t1
LEFT JOIN Table2 t2
    ON t1.fk = t2.pk

现在,为了运行这个查询,我使用http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/advanced-entity-framework-scenarios-for-an-mvc-web-application 中描述的技术

相关代码为:

public virtual IEnumerable<TEntity> GetWithRawSql(string query, params object[] parameters)

    return dbSet.SqlQuery(query, parameters).ToList();

我在哪里输入上述查询。

问题(终于!)是实体框架需要一个密钥。这不会有问题,但在这种情况下,key 是 Table1.table1KeyPart 和 Table2.table2KeyPart,对应于 Model1.model1Keypart 和 Model2.model2keypart。

所以我在这里尝试使用第二种技术: in entity framework code first, how to use KeyAttribute on multiple columns

即使用HasKey,用u.Model1.model1KeyPartu.Model2.model2KeyPart代替userID和userName。像这样:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    
        modelBuilder.Entity<Model3>().HasKey(u => new
        
            u.Model1.model1KeyPart,
            u.Model2.model2keyPart
        );
    

我得到错误:

属性表达式 '[u => new f__AnonymousType1`2(model1KeyPart = u.Model1.model1KeyPart, model2KeyPart = u.Model2.model2KeyPart)]' 是 无效。表达式应该代表一个属性:C#: 't => t.MyProperty' VB.Net:'函数(t)t.MyProperty'。指定时 多个属性使用匿名类型:C#: 't => new t.MyProperty1, t.MyProperty2 ' VB.Net: 'Function(t) New From t.MyProperty1, t.MyProperty2 '。

这是可以修复的吗?还是我这样做完全错误?我想我可以在 Model3 中列出 Model1 和 Model2 的所有成员,但这引入了我真的不想要的冗余,但如果这是唯一的方法,那么我会这样做。

抱歉,如果有任何不清楚的地方,我会在需要时尝试解决问题。提前感谢您的帮助!

【问题讨论】:

【参考方案1】:

我认为您需要定义复合键,如果您首先使用实体​​框架代码,您可以在 dbContext.cs 中的 OnModelCreating 这样的方法中执行此操作

modelBuilder.Entity<Model3>().HasKey(s => new  s.Model1Key, s.Model2Key );

【讨论】:

感谢您的回复!对不起,但我想我造成了一些混乱。您所拥有的与我所做的类似(请参阅编辑中的新代码段)。我认为问题在于我的 LINQ 也缺少。我认为这归结为一个问题,在那个 LINQ 表达式中,我可以做 u.Model1.model1KeyPart,还是我必须直接在 model3 中制作 model1KeyPart,这样它就像你拥有它一样?显然我的方式存在一些问题。但也许有解决办法?

以上是关于使用多个数据库表的 ASP.NET MVC 模型的主要内容,如果未能解决你的问题,请参考以下文章

与实体框架 ASP.net MVC 中多个表的可选关系

ASP.NET MVC 中相同模型数据的多个输入字段

将多个模型传递给 ASP.NET MVC 中的视图

ASP.NET MVC 用户 ID 与其他表的链接

Asp.net Mvc post表单提交多个实体模型

是否可以将多个模型对象发送到 ASP.NET MVC 视图?