C# 一对一或零实体框架Fluent API
我正在使用fluentapi创建一对一或零的关系,在第一种情况下 Manager-ContactDetails有效,但在第二种情况下,Representative-ContactDetails无效。但配置是相同的 据我所知,在一对一/零关系中,两个类中的一个应该将键定义为primary和foreignKey,以便知道哪个类是依赖的。例如,ContactDetails中的Id不能同时作为代表表和经理表的外键?这就是为什么会自动创建一个代表Id?但为什么这种关系被认为是一对多 管理类:C# 一对一或零实体框架Fluent API,c#,sql-server,entity-framework-6,ef-fluent-api,C#,Sql Server,Entity Framework 6,Ef Fluent Api,我正在使用fluentapi创建一对一或零的关系,在第一种情况下 Manager-ContactDetails有效,但在第二种情况下,Representative-ContactDetails无效。但配置是相同的 据我所知,在一对一/零关系中,两个类中的一个应该将键定义为primary和foreignKey,以便知道哪个类是依赖的。例如,ContactDetails中的Id不能同时作为代表表和经理表的外键?这就是为什么会自动创建一个代表Id?但为什么这种关系被认为是一对多 管理类: [Ta
[Table("Manager")]
public class Manager
{
[Key]
[ForeignKey("ApplicationUser")]
public string Id { get; set; }
[Required]
[MaxLength(100)]
public string Name { get; set; }
public virtual ContactDetail ContactDetail { get; set; }
[JsonIgnore]
public virtual ICollection<Client> Clients { get; set; }
public virtual ApplicationUser ApplicationUser { get; set; }
}
[Table("Representative")]
public class Representative
{
[Key]
public int Id { get; set; }
[Required]
[MaxLength(99)]
public string Name { get; set; }
[Required]
public int ClientId { get; set; }
[JsonIgnore]
public virtual Client Client{ get; set; }
public virtual ContactDetail ContactDetail {get; set; }
}
public class ContactDetail
{
[Key]
public string Id { get; set; }
[Required]
[MaxLength(100)]
public string FirstName { get; set; }
[MaxLength(100)]
public string SecondName { get; set; }
[MaxLength(100)]
public string LastName { get; set; }
[JsonIgnore]
public virtual Manager Manager { get; set; }
[JsonIgnore]
public virtual Representative Representative { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Manager>()
.HasOptional(m => m.ContactDetail)
.WithRequired(ad => ad.Manager);
modelBuilder.Entity<Representative>()
.HasOptional(c => c.ContactDetail)
.WithRequired(ad => ad.Representative);
base.OnModelCreating(modelBuilder);
}
联系人详细信息类别:
[Table("Manager")]
public class Manager
{
[Key]
[ForeignKey("ApplicationUser")]
public string Id { get; set; }
[Required]
[MaxLength(100)]
public string Name { get; set; }
public virtual ContactDetail ContactDetail { get; set; }
[JsonIgnore]
public virtual ICollection<Client> Clients { get; set; }
public virtual ApplicationUser ApplicationUser { get; set; }
}
[Table("Representative")]
public class Representative
{
[Key]
public int Id { get; set; }
[Required]
[MaxLength(99)]
public string Name { get; set; }
[Required]
public int ClientId { get; set; }
[JsonIgnore]
public virtual Client Client{ get; set; }
public virtual ContactDetail ContactDetail {get; set; }
}
public class ContactDetail
{
[Key]
public string Id { get; set; }
[Required]
[MaxLength(100)]
public string FirstName { get; set; }
[MaxLength(100)]
public string SecondName { get; set; }
[MaxLength(100)]
public string LastName { get; set; }
[JsonIgnore]
public virtual Manager Manager { get; set; }
[JsonIgnore]
public virtual Representative Representative { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Manager>()
.HasOptional(m => m.ContactDetail)
.WithRequired(ad => ad.Manager);
modelBuilder.Entity<Representative>()
.HasOptional(c => c.ContactDetail)
.WithRequired(ad => ad.Representative);
base.OnModelCreating(modelBuilder);
}
重写上下文中的方法:
[Table("Manager")]
public class Manager
{
[Key]
[ForeignKey("ApplicationUser")]
public string Id { get; set; }
[Required]
[MaxLength(100)]
public string Name { get; set; }
public virtual ContactDetail ContactDetail { get; set; }
[JsonIgnore]
public virtual ICollection<Client> Clients { get; set; }
public virtual ApplicationUser ApplicationUser { get; set; }
}
[Table("Representative")]
public class Representative
{
[Key]
public int Id { get; set; }
[Required]
[MaxLength(99)]
public string Name { get; set; }
[Required]
public int ClientId { get; set; }
[JsonIgnore]
public virtual Client Client{ get; set; }
public virtual ContactDetail ContactDetail {get; set; }
}
public class ContactDetail
{
[Key]
public string Id { get; set; }
[Required]
[MaxLength(100)]
public string FirstName { get; set; }
[MaxLength(100)]
public string SecondName { get; set; }
[MaxLength(100)]
public string LastName { get; set; }
[JsonIgnore]
public virtual Manager Manager { get; set; }
[JsonIgnore]
public virtual Representative Representative { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Manager>()
.HasOptional(m => m.ContactDetail)
.WithRequired(ad => ad.Manager);
modelBuilder.Entity<Representative>()
.HasOptional(c => c.ContactDetail)
.WithRequired(ad => ad.Representative);
base.OnModelCreating(modelBuilder);
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
modelBuilder.Entity()
.has可选(m=>m.ContactDetail)
.WithRequired(ad=>ad.Manager);
modelBuilder.Entity()
.has可选(c=>c.ContactDetail)
.需要(广告=>广告代表);
基于模型创建(modelBuilder);
}
FYI:one-to-one和many-to-many关系不合逻辑,无法在数据库中表示。只支持一对多关系possible@CamiloTerevinto我需要一个经理只有一个ContactDetail或零,而且一个代表只有一个ContactDetail或零。如果我将foreignKeys添加到ContactDetail表中,最终将是一对多关系-我如何实现只添加一条记录(一名经理-一条ContactDetail记录)modelBuilder.Entity().has可选(r=>r.ContactDetail).WithOptionalPrincipal(c=>c.Representative).Map(m=>m.MapKey(“RepresentativeId”)代码>