【问题标题】:Defining entity with specific column name for a one-to-one relation in EF Core在 EF Core 中为一对一关系定义具有特定列名的实体
【发布时间】:2021-09-07 12:20:06
【问题描述】:

我正在尝试在我的实体中使用代码优先定义一些列名。我正在使用 .NET Core 3.1、EF Core 3.1.15 和 MySQL 服务器。

我有类似这种情况的实体之间的关系

我有一个属于State 的City。所以这是从City 到State 的一对一关系。

这是一个例子

public class City 
{
    [Column("IdCity")]
    public short IdCity { get; set; }
    [Column("IdState")] 
    public State State { get; set; }
   
}

public class State
{
    [Column("IdState")]
    public byte IdState { get; set; }
}

问题是如果我运行迁移然后持久化数据库更改,它会生成下表

表City:

IdCity | StateIdState | ....

表State:

 IdState | ... | ...

我需要在物理数据库中将StateIdState 列定义为IdState。

我尝试使用不同的注释,如 FK、列等,但它不起作用,它总是生成该名称。

有没有办法可以省略附在列名第一部分的实体名称?

我这样做是因为我已经在服务器中创建了这两个表,所以我需要匹配它们的架构才能与它们交互。

【问题讨论】:

    标签: c# entity asp.net-core-3.1 ef-core-3.1


    【解决方案1】:

    你有一个错误,添加 IdState 列并使用双引号

    public class City {
       [Column("IdCity")]
       public short IdCity {get;set;}
       [Column("IdState")] 
       public byte IdState {get;set;}
       public virtual  State State {get;set;}
         ....
    

    但您不需要任何列属性,因为 EF 会自动提供相同的名称。仅当您希望列名与属性名不同时才需要它。

    【讨论】:

    • 这是真的 EF 核心自动给出相同的名称,但问题是如果我定义 IdState 而不是 State,交互看起来有点奇怪,它不是一个 ID,它是一个具有属性的实体。
    • @没有列State,不是MongoDb,每列只能保留原始类型,不能保留整个类实例。
    • 我再次检查了您的解决方案,我的错,我没有在最后一行看到虚拟变量。我会将您的答案标记为解决方案,谢谢
    【解决方案2】:

    在之前的解决方案中,我添加了以下注释以保持实体和外键同步。

    public class City {
       [Column("IdCity")]
       public short IdCity {get;set;}
       [ForeignKey("State")]
       public int IdState {get;set;}
       [ForeignKey("IdState")]
       public virtual  State State {get;set;}
    }
    
    public class State
    {
        [Column("IdState")]
        public int IdState { get; set; }
    }
    

    现在我的数据库架构是正确的。

    【讨论】:

      猜你喜欢
      • 2016-01-13
      • 2015-06-16
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      • 1970-01-01
      相关资源
      最近更新 更多