我开始使用Entity Framework(使用POCO类)进行Razor Views的MVC 3 C#项目。
我无法用它来表达多对多的功能
我正在尝试创建一个视图,当用户能够通过多对多关系添加电话号码,电子邮件,音乐类型,旗帜,保留,ntoes等时
即。)公司----> CompanyVenue< ---- Venue
我已经设法让EF存储场地,然后通过选择列表中的场地并分配给公司来设置场地。
有没有办法让The Venue自动存储从公司到场馆的关系,而不必通过列表选择它?
如果不可能,任何人都可以使用EF分享更好的Implimenting方式。
答案 0 :(得分:0)
只需进行这种简单的设置:
public Company
{
public virtual ICollection<Venue> Venues { get; set; }
}
public Venue
{
public virtual ICollection<Company> Companies { get; set; }
}
EF应该能够确定您宣布多对多关系。我不知道你是使用EF 4.1 Code First还是模型设计师,但是Code First应该为此创建CompanyVenue
表。模型设计师将为您定义“链接”表,并在您声明多对多关系时立即定义。
请注意,导航属性标记为virtual
。这在集合的情况下是必要的,以便EF可以在相关实体中进行适当的更新。
答案 1 :(得分:0)
以下是如何在Code First中手动执行此操作。首先,您的POCO课程可能如下所示:
public class Company
{
public Company()
{
Venues = new List<Venue>();
}
public int CompanyID { get; set; }
public string CompanyName { get; set; }
public virtual ICollection<Venue> Venues { get; set; }
}
public class Venue
{
public int VenueID { get; set; }
public string VenueName { get; set; }
public virtual ICollection<Company> Companies { get; set; }
}
在你的DbContext中:
public IDbSet<Company> Companies { get; set; }
public IDbSet<Venue> Venues { get; set; }
同样在DbContext类中重写OnModelCreating方法。这就是你如何映射公司和地点之间的多对多关系:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Company>()
.HasMany(comp => comp.Venues)
.WithMany(venue => venue.Companies)
.Map(mc =>
{
mc.ToTable("T_Company_Venue");
mc.MapLeftKey("CompanyID");
mc.MapRightKey("VenueID");
}
);
base.OnModelCreating(modelBuilder);
}
我在这里用完整的示例代码回答了另外一个EF很多问题:
我还将上述内容写入2篇博文,其中包含完整的解决方案和示例代码供下载:
第1部分:
第2部分: