我在stackoverflow.com上的第一个问题!祝我好运:)
我正在尝试用一些测试数据播种开发数据库,需要在两个字段上匹配,并在此处遇到的问题如何用Addorupdate用EF 4.3
中的复杂键播种数据。我得到了lukyer评论中提到的Only primitive types or enumeration types are supported in this context.
错误。
但是,尽管添加了外键属性,并且正如他所建议的模型中所需的属性所需的属性,但我找不到明显的方法来清除错误。
关于如何成功地收到有关如何成功播种数据库的任何想法。
模型的重要部分如下:
public class User {
public string ID { get; set; }
public string Email {get; set; }
}
public class Institution {
public Guid ID { get; set;}
public string Name {get; set; }
}
public class UserInstitutionAssociation {
public Guid ID { get; set; }
public virtual User User { get; set; }
public virtual Institution Institution {get; set;}
}
,然后从configuration.cs迁移的代码添加了一个用户(jamesbond@mi5.com)和一个机构(最高机密机构)。然后,它尝试在用户和机构之间添加关联,仅当两者之间的关联尚不存在时,才应添加它。
//Add User to Database
context.Users.AddOrUpdate(u => u.Email,
new User {
Email = "jamesbond@mi5.com"
});
context.SaveContext();
//Add Institution to Database
context.Institutions.AddOrUpdate(u => u.Name,
new Institution {
Name = "Top Secret Establishment"
});
context.SaveContext();
//Add Association between User and Institution
context.InstitutionUserAssociations.AddOrUpdate(u => new { u.User, u.Institution },
new InstitutionUserAssociation
{
User = context.Users.Single(x => x.Email=="jamesbond@mi5.com"),
Institution = context.Institutions.Single(x => x.Name=="Top Secret Establishment")
}
);
context.SaveContext();
我已经尝试以多种方式更改模型,因为我了解卢基(Lukyer)建议的建议,包括这里描述的所有解决方案,我应该如何使用MVC3中的代码Firstentity Framework(4.1)声明外国密钥关系?
?简而言之,我尝试了以下所有组合而没有成功:
public class UserInstitutionAssociation {
public Guid ID { get; set; }
[Required]
[ForeignKey("UserID")]
public virtual User User { get; set; }
[Required]
[ForeignKey("InstitutionID")]
public virtual Institution Institution {get; set;}
}
和
public class UserInstitutionAssociation {
public Guid ID { get; set; }
[Required]
[ForeignKey("User")]
public string UserID {get; set; }
public virtual User User { get; set; }
[Required]
[ForeignKey("Institution")]
public Guid InstitutionID { get; set; }
public virtual Institution Institution {get; set;}
}
已解决。由于我包含的类作为LINQ查询的一部分而发生。您不能使用x => new { x.User, x.Institution}
,因为X.user和X.Institution都是复杂的类。相反,这些需要是原始的基本类型(例如字符串或GUID)。它以这种方式更改了AddOrUpdate(x => new {x.UserID, x.InstitutionID}, Associations)
。然后需要更改该模型,因此它包含称为userId和InstitutionId的属性,该属性可以由Linq。
我按以下方式调整了UserInstitutionAssociation代码,因此它包括称为userId和InstitutionId的属性以及用户和I:
:public class UserInstitutionAssociation {
public Guid ID { get; set; }
[Required]
[ForeignKey("User")]
public string UserID {get; set; }
public virtual User User { get; set; }
[Required]
[ForeignKey("Institution")]
public Guid InstitutionID { get; set; }
public virtual Institution Institution {get; set;}
}
然后按以下方式调整addorupdate调用:
//Add Association between User and Institution
context.InstitutionUserAssociations.AddOrUpdate(u => new { u.UserID, u.InstitutionID },
new InstitutionUserAssociation
{
User = context.Users.Single(x => x.Email=="jamesbond@mi5.com"),
Institution = context.Institutions.Single(x => x.Name=="Top Secret Establishment")
}
);