4

我是使用 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-中描述的技术一个-mvc-web-应用程序

相关代码为:

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。

所以我在这里尝试使用第二种技术: 首先在实体框架代码中,如何在多个列上使用 KeyAttribute

也就是使用 HasKey 的那个,用u.Model1.model1KeyPart,u.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: 'Function(t) t.MyProperty'。指定多个属性时使用匿名类型:C#: 't => new { t.MyProperty1, t.MyProperty2 }' VB.Net: 'Function(t) New From { t.MyProperty1, t.MyProperty2 }'。

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

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

4

1 回答 1

4

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

modelBuilder.Entity<Model3>().HasKey(s => new { s.Model1Key, s.Model2Key });
于 2012-06-27T04:20:56.553 回答