【问题标题】:How to create nullable one-to-many relationship in Entity Framwork 6 code first如何首先在 Entity Framework 6 代码中创建可为空的一对多关系
【发布时间】:2016-05-06 23:20:24
【问题描述】:

我首先使用 EF 6.1 代码构建应用程序。实体模型包含以下类:

public enum UnitSystem {
    English,
    Metric
}

public enum UnitTypes {
    Volume,
    Weight,
    Other
}

public class Unit {

    [DatabaseGenerated( DatabaseGeneratedOption.Identity ), Key]
    public int UnitId { get; set; }

    [Required, MaxLength( 128 ), Index( IsUnique = true )]
    public string UnitName { get; set; }

    [Required]
    public UnitSystem UnitSystem { get; set; }

    [Required]
    public UnitTypes UnitType { get; set; }

    public virtual ICollection<Item> Items { get; set; }
}

public class Item {

    [DatabaseGenerated( DatabaseGeneratedOption.Identity ), Key]
    public int ItemId { get; set; }

    [Required, MaxLength( 128 ), Index( IsUnique = true )]
    public string ItemName { get; set; 

    [Required]
    public int UnitId { get; set; }

    [ForeignKey( "UnitId" )]
    public virtual Unit Units { get; set; }

    /// Other unimportant properties
}

public class UnitConversion {

    [Required, Key, Column( Order = 0 )]
    public int FromUnitId { get; set; }

    [ForeignKey( "FromUnitId" )]
    public virtual Unit FromUnit { get; set; }

    [Required, Key, Column( Order = 1)]
    public int ToUnitId { get; set; }

    [ForeignKey( "ToUnitId" )]
    public virtual Unit ToUnit { get; set; }

    [Key, Column( Order = 2 )]
    public int? ItemId { get; set; }

    public virtual Item Item { get; set; }

    [Required]
    public double ConversionFactor { get; set; }
}

当 EF 构建数据库时,我收到“Introducing FOREIGN KEY CONSTRAINT”消息。我需要ItemId 属性可以为空,如果它不为空,我需要它作为Items 表的外键。

创建这种关系以避免级联删除错误的正确方法是什么?

编辑

我不再收到ItemId 列上的错误;现在我将它用于FromUnitIdToUnitId 列,或两者兼而有之。

我已将导航属性添加到 Unit 类:

[ForeignKey("FromUnitId")]
public virtual ICollection<UnitConversion> FromConversions { get; set; }

[ForeignKey("ToUnitId")]
public virtual ICollection<UnitConversion> ToConversions { get; set; }

这是我收到的错误消息的全文:

在表“UnitConversions”上引入 FOREIGN KEY 约束“FK_dbo.UnitConversions_dbo.Units_ToUnitId”可能会导致循环或多个级联路径。指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

UnitConversions 表和Units 表之间应该存在零或一对多的关系。当我尝试创建对modelBuiloder.Entity&lt;UnitConversions&gt;().WillCascadeOnDelete(false) 的调用时,IntelliSense 不显示WillCascadeOnDelete 方法,并且代码不会编译。

【问题讨论】:

  • 你在说UnitConversion中的ItemId吗?如果您希望它成为[ForeignKey],请不要在其上添加[Key] 属性
  • 是的,就是这个。在这种情况下,如何确保存在包含该列的索引?
  • 关于这个问题有很多问题。找到正确的流畅映射应该不难。

标签: c# entity-framework entity-framework-6


【解决方案1】:

首先,我建议您快速阅读entityframeworktutorial,以确保您按照建议设置了密钥。对于 1 对 1 的关系,这有点棘手;基本上“子”的主键是“父”的外键。

或者,您可以在数据上下文中使用流式 API 并执行以下操作以确保关系和级联按预期进行:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<Student>().HasOptional(e => e.StudentAddress)
            .WithRequired(m => m.Student);

        modelBuilder.Entity<StudentAddress>.WillCascadeOnDelete(false);

    }

这表示学生有一个可选的学生地址,学生地址有一个必需的学生,当学生地址被删除时,学生不是。

【讨论】:

    猜你喜欢
    • 2013-09-14
    • 2021-04-21
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2015-02-17
    相关资源
    最近更新 更多