我是使用MVC的新手,我正在尝试制作一个使用其他模型的模型。
假设我在我的数据库中有2个表,为了这个问题,我只是将它们称为Table1和Table2。在我的MVC项目中,这些对应于Model1和Model2。现在我想要模型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();
}
我在上面提供上述查询。
问题(终于!)是实体框架想要一个密钥。这不是问题,但在这种情况下,键是Table1.table1KeyPart和Table2.table2KeyPart,对应于Model1.model1Keypart和Model2.model2keypart。
所以我尝试使用第二种技术: in entity framework code first, how to use KeyAttribute on multiple columns
即使用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 =&gt; new&lt;&gt; f__AnonymousType1`2(model1KeyPart = u.Model1.model1KeyPart,model2KeyPart = u.Model2.model2KeyPart)]'是 无效。表达式应代表一个属性:C#:'t =&gt; t.MyProperty'VB.Net:'Punction(t)t.MyProperty'。指定时 多个属性使用匿名类型:C#:'t =&gt;新{ t.MyProperty1,t.MyProperty2}'VB.Net:'Function(t)New From { t.MyProperty1,t.MyProperty2}'。
这是可以修复的吗?或者我是以完全错误的方式做到这一点的?我想我可以在Model3中列出Model1和Model2的所有成员,但是这会引入我真正不想要的冗余,但如果这是唯一的方法,那么我会这样做。
很抱歉,如果其中任何一项不清楚,我会尽量清理一下。在此先感谢您的帮助!
答案 0 :(得分:4)
我认为您需要定义组合键,如果您首先使用Entity Framework代码,则可以在dbContext.cs
方法OnModelCreating
中执行此操作
modelBuilder.Entity<Model3>().HasKey(s => new { s.Model1Key, s.Model2Key });