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 – 如何使用ValueInjector映射列表
- asp.net – FederatedAuthentication.WSFederationAuthenti
- 在asp.net中验证字符串是否为json
- asp.net-mvc – ASP.net MVC – 视图如何访问模型?
- 如何在ASP.NET中继器DataDataBound事件中访问数据源字段?
- asp.net-mvc – Chrome 27中SignalR和跨域请求的问题
- asp.net – 干净的方式来防止输入按钮提交表单
- 使用WebAPI进行RESTFul身份验证
- asp.net-mvc – 如何在剃刀中获取页面原点?
- asp.net – ADFS 2.0超时以及Freshness Value,TokenLifetim
- asp.net – Web应用程序中的自动填充,我应该在哪
- asp.net-mvc – 如何将默认值显示为空白而不是类
- asp.net-mvc – IE 11 SignalR不工作
- asp.net-mvc – 企业库日志记录 – 从格式中删除
- asp.net实现access数据库分页的方法
- asp.net-mvc – MVC / Razor – 当有下列括号时,
- ASP.NET MVC UrlHelper.GenerateUrl异常:“无法
- asp.net-mvc – 我真的需要一个ORM吗?
- asp.net-identity – 使用asp.net身份在身份服务
- asp.net-mvc-3 – ASP.MVC 3 Razor在Html.Partia
