asp.net-mvc-4 – 实体框架代码第一个多对多关系和继承
请原谅我,如果这个问题已在某个地方得到解答,我一直很难找到解决这个问题的方法.
我正在尝试在MVC4项目上设置EF Code First.我有一个继承自Person的用户和客户.然后我有一个Template对象,它与Customer有多对多的关系,与User有一对多的关系.以下是我设置的方法: 楷模 public class Person { [Key] public int PersonID { get; set; } public string LastName { get; set; } public string FirstName { get; set; } public string FullName { get { return String.Format("{0} {1}",FirstName,LastName); } } public string Email { get; set; } public virtual List<Template> Templates { get; set; } } public class User : Person { .... } public class Customer : Person { .... } public class Template { public int TemplateId { get; set; } public string TemplateName { get; set; } public virtual List<Customer> Customers { get; set; } [ForeignKey("User")] public int UserId { get; set; } public virtual User User { get; set; } } CONTEXT public class ProjectContext : DbContext { public ProjectContext() : base("name=ProjectDB") { } public DbSet<Template> Templates { get; set; } public DbSet<User> Users { get; set; } public DbSet<Customer> Customers { get; set; } public DbSet<Person> People { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Conventions .Remove<PluralizingTableNameConvention>(); modelBuilder.Entity<Template>() .HasMany(x => x.Customers) .WithMany(x => x.Templates) .Map(x => x.MapLeftKey("TemplateId") .MapRightKey("PersonId") .ToTable("TemplateCustomer") ); } } 如果我从上下文中删除Person DBSet,这可以正常工作但设置TPT继承.我想使用TPH继承,但是当我在上下文中启用Person DBSet的迁移时,它会阻塞: NavigationProperty“模板”无效.在AssociationType’MvcProject.Models.Template_Customers’中键入FromRole’Template_Customers_Target’的’MvcProject.Models.Customer’必须与声明此NavigationProperty的类型’MvcProject.Models.Person’完全匹配. 我在哪里错了? 解决方法
您无法从基础实体继承导航属性.它们总是必须在关系的另一端引用的类中声明.
> Template.Customers引用Customer(而不是Person),因此必须在Customer(非Person)中声明反向导航属性模板 所以,基本上你必须将模板集合从Person移动到两个派生类中: public class Person { // no Templates collection here } public class User : Person { //... public virtual List<Template> Templates { get; set; } } public class Customer : Person { //... public virtual List<Template> Templates { get; set; } } 然后,您可以使用Fluent API定义两个关系,如下所示: modelBuilder.Entity<Template>() .HasMany(t => t.Customers) .WithMany(c => c.Templates) // = Customer.Templates .Map(x => x.MapLeftKey("TemplateId") .MapRightKey("PersonId") .ToTable("TemplateCustomer")); modelBuilder.Entity<Template>() .HasRequired(t => t.User) .WithMany(u => u.Templates) // = User.Templates .HasForeignKey(t => t.UserId); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 如何从WCF客户端拦截raw soap request / respon
- ASP.Net MVC 3 – 密码保护视图
- 与32位相比,ASP.NET 4.0工作进程在64位内消耗的内存增加了5
- mvc-mini-profiler – MVC MiniProfiler与ASP.NET MVC 4
- asp.net – 一些黑客可以从用户窃取cookie,并在网站上使用该
- asp.net-mvc – Steve Sanderson的BeginCollectionItem帮助
- asp.net-mvc-3 – ReSharper无法解析Razor
- asp.net-mvc – 仅在MVC4 BundleConfig中缩小脚本
- asp.net – 如何指定现有的ClaimsIdentity的目的地?
- Azure Event Hub 技术研究系列2-发送事件到Event Hub
- ASP.NET Core2.2+Quartz.Net 实现web定时任务
- ASP.NET支持C吗?
- asp.net – MVC4上的_layout.cshtml的@model?
- asp.net-web-api – 在Windows服务中使用OWIN托管
- ASP.NET MVC用户 – 您是否想念WebForms中的任何
- asp.net-mvc – 为什么ASP.NET MVC在数据绑定期间
- asp.net – 找不到aspnet_regiis部分
- asp.net-mvc – 发布MVC应用程序VS2013时未包含字
- asp.net-mvc – ASP.NET MVC:Action中的授权 –
- [asp.net mvc 奇淫巧技] 05 - 扩展ScriptBundle,