【发布时间】: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 列上的错误;现在我将它用于FromUnitId 或ToUnitId 列,或两者兼而有之。
我已将导航属性添加到 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<UnitConversions>().WillCascadeOnDelete(false) 的调用时,IntelliSense 不显示WillCascadeOnDelete 方法,并且代码不会编译。
【问题讨论】:
-
你在说
UnitConversion中的ItemId吗?如果您希望它成为[ForeignKey],请不要在其上添加[Key]属性 -
是的,就是这个。在这种情况下,如何确保存在包含该列的索引?
-
关于这个问题有很多问题。找到正确的流畅映射应该不难。
标签: c# entity-framework entity-framework-6