gpt4 book ai didi

entity-framework - Entity Framework (代码优先)一对多和一对一关系(有两个实体)。如何?

转载 作者:行者123 更新时间:2023-12-01 02:12:07 25 4
gpt4 key购买 nike

我正在尝试使用 EF Code First 来做到这一点:

database model

区域有两个表:用户和区域。一个用户属于一个需要的区域,一个区域可以有零个或一个用户(作为管理员)。然后:

用户 *..1 区域和
用户 0..1 领域

用户类:

public class User {
public int UserId { get; set; }
public string Name { get; set; }

[ForeignKey("Area")]
public int AreaId { get; set; }
[InverseProperty("Users")]
public virtual Area Area { get; set; }

public virtual Area AreaTitular { get; set; }
}

领域类:
public class Area {
public int AreaId { get; set; }
public string Name { get; set; }

public List<User> Users { get; set; }

[ForeignKey("User")]
public int? UserId { get; set; }
[InverseProperty("AreaTitular")]
public virtual User User{ get; set; }
}

以及 update-database 命令的错误:

Unable to determine the principal end of an association between the types 'TestEntityFrameworkCodeFirst.Model.Area' and 'TestEntityFrameworkCodeFirst.Model.User'. The principal end of this association must be explicitly configured using either the relationship fluent API or data annotations.



任何帮助将不胜感激:)

我不完全确定这是否可以:
protected override void OnModelCreating(DbModelBuilder modelBuilder) {
modelBuilder.Entity<Area>()
.HasOptional(i => i.User)
.WithOptionalDependent();
base.OnModelCreating(modelBuilder);
}

刚刚在 Context 类的 OnModelCreating 上添加了这个。这就是它在 SQL Server 中的样子:

Database

最佳答案

问题在于您的一对一关系的配置,因为一端必须是 校长 第二端必须是 依赖 .在配置这种关系时,Entity Framework 要求依赖的主键也是外键。所以,不要映射 UsuarioId作为 FK,否则,EF 要求 FK 也必须是 PK(注释该属性)。另一个问题是 EF 不知道谁是你们关系中的负责人。要指定谁是委托(delegate)人,请使用 Required 属性。例如,如果您将此属性添加到 AreaTitular ,您指定创建一个 User , AreaTitular保存更改后必须设置属性,因此在这种情况下您的主体是 Area并且依赖是User ,但这是假设的场景,我不知道你的逻辑。
查看此帖子以获取更多信息:

  • One to one optional relationship using Entity Framework Code First
  • What does principal end of an association means in 1:1 relationshipin Entity framework

  • 现在,可以将两端指定为可选,但其中之一必须是主体。如果这是您的情况,我建议您评论 Data Annotations 属性并使用 Fluent Api 配置关系:
       protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
    modelBuilder.Entity<User>()
    .HasRequired(a => a.Area)
    .WithMany(c => c.Usuarios)
    .HasForeignKey(a => a.AreaId);

    modelBuilder.Entity<Area>()
    .HasOptional(a => a.Usuario)
    .WithOptionalPrincipal(u => u.AreaTitular);
    }

    我建议你阅读这篇 page更好地理解一对一的关系。

    关于entity-framework - Entity Framework (代码优先)一对多和一对一关系(有两个实体)。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28419103/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com