【问题标题】:C# EntityCode First : Unwanted foreign key createdC# EntityCode First:创建了不需要的外键
【发布时间】:2019-02-01 19:16:34
【问题描述】:

我有一个与两者相关的“声明”表:

  • “交易”表(在 IdStatement 上有一个外键)
  • “SpecificTransactions”表。 “SpecificTransaction”类继承自“Transaction”表

这是现有的代码First Model:

  1. 表格语句

    [Serializable]
    [Table("Statement", Schema = "dbo")]
    public class Statement
    {
        public Statement()
        {
            this.Transactions = new List<Transaction>();
            this.SpecificTransactions = new List<SpecificTransaction>();
        }
    
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int IdStatement { get; set; }
    
        public List<Transaction> Transactions { get; set; }
        public List<SpecificTransaction> SpecificTransactions { get; set; }
    
        [... Other properties ...]
    }
    
  2. 表事务

    [Serializable]
    [Table("Transaction", Schema = "dbo")]
    public class Transaction
    {
        [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int IdTransaction { get; set; }
    
        [ForeignKey("Statement")]
        public Nullable<int> IdStatement { get; set; }
    
        [... Other properties ...]
    
    }
    
  3. Table SpecificTransaction(继承自 Transaction)

    [Serializable]
    [Table("SpecificTransaction", Schema = "dbo")]
    public class SpecificTransaction : Transaction
    {
    
        [StringLength(255)]
        public string UniqueValue { get; set; }
    
        [StringLength(50)]
        public string Status { get; set; }
    
        [StringLength(50)]
        public string Hash { get; set; }
    
        [... Other properties ...]
    
    }
    

创建数据库时,在我的表 SpecificTransaction 上添加了一个不需要的字段(即列),称为“Statement_IdStatement”。

当我尝试添加包含SpecificTransactions 的语句时,以下列都没有:

  • 表事务 > 列 IdStatement
  • Table SpecificTransaction > 列 Statement_IdStatement

正在由 IdStatement 填充,我必须在之后添加 Id。

此外,当我在我的表“SpecificTransaction”上分配“IdStatement”时,只填充了“Statement_IdStatement”列,而不是我的表 Statement 的“IdStatement”。

有没有办法:

  • 避免创建“Statement_IdStatement”列并以这种方式保持我的 EF Code First 类? (或者至少,Statement 和 Transaction 表没有变化)

  • 当我添加包含 SpecificTransactions 的 Statements 并保存Changes 时,“Transaction”>“IdStatement”列会自动填充?

提前致谢。

【问题讨论】:

    标签: c# entity-framework foreign-keys ef-code-first


    【解决方案1】:

    您将获得额外的列Statement_IdStatement,因为您已经声明了第二个关系,直接在StatementSpecificTransaction 模型类型之间,即通过Statement 类上的属性public List&lt;SpecificTransaction&gt; SpecificTransactions。这足以导致实体框架创建一个额外的表列来映射该一对多关系,这就是它被填充的原因。不需要将其映射到额外的外键模型属性即可。

    您可能实际上并不需要Statement 上的额外属性。您实际上可以将 SpecificTransaction 对象插入到 Transactions 列表属性中,映射将为您处理。

    您可能已声明此属性,以便只能访问您的StatementSpecificTransaction 对象。如果这是您的意图,您也可以使用 myStatement.Transactions.OfType&lt;SpecificTransaction&gt;() 访问它们。

    【讨论】:

    • 感谢您的回答。它解决了我的问题。如果需要,我可以在我的第一篇文章中发布包含更正的代码。
    猜你喜欢
    • 2012-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-12
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多