繁体   English   中英

通过EF4.3中的代码优先方法模型在实体之间创建多个(一对多)关系

[英]Create more than one (one to many) relations between to entity by code first approach model in EF4.3

谢谢你的关注。 在开发会计程序期间,我遇到了一个问题,需要一些帮助工程师。

我必须要实体: 产品单位

 [Table("Products")] 
public class Product
{

    #region Properties

    private int _Id;
    [Key]
    [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]
    public int Id
    {
        get { return _Id; }
        set { _Id = value; }
    }

    private string _Name;
    [Required]
    [MaxLength(50)]
    public string Name
    {
        get { return _Name; }
        set { _Name = value; }
    }

    private string _Code;
    [Required]
    [MaxLength(20)]
    public string Code
    {
        get { return _Code; }
        set { _Code = value; }
    }      

    private int _MainUnitId;
    [Required]
    public int MainUnitId
    {
        get { return _MainUnitId; }
        set { _MainUnitId = value; }
    }

    private int _SubsidiaryUnitId;
    [Required]
    public int SubsidiaryUnitId
    {
        get { return _SubsidiaryUnitId; }
        set { _SubsidiaryUnitId = value; }
    }

    private int _SnachUnitId;
    [Required]
    public int SnachUnitId
    {
        get { return _SnachUnitId; }
        set { _SnachUnitId = value; }
    }

    private decimal _SubidiaryCount;
    [Required]
    public decimal SubidiaryCount
    {
        get { return _SubidiaryCount; }
        set { _SubidiaryCount = value; }
    }

    private decimal _SnachCount;
    [Required]
    public decimal SnachCount
    {
        get { return _SnachCount; }
        set { _SnachCount = value; }
    }               


    #endregion Proerties

    #region Navigators

    private Unit _MainUnit;
    [ForeignKey("MainUnitId")]
    public virtual Unit MainUnit
    {
        get { return _MainUnit; }
        set { _MainUnit = value; }
    }

    private Unit _SubsidiaryUnit;
    [ForeignKey("SubsidiaryUnitId")]
    public virtual Unit SubsidiaryUnit
    {
        get { return _SubsidiaryUnit; }
        set { _SubsidiaryUnit = value; }
    }



    private Unit _SnachUnit;
    [ForeignKey("SnachUnitId")]
    public virtual Unit SnachUnit
    {
        get { return _SnachUnit; }
        set { _SnachUnit = value; }
    }

    #endregion Navigators

}

这是我的单位实体:

[Table("Units")]
public class Unit
{

    private int _Id;

    [Key]
    [DatabaseGenerated(System.ComponentModel.DataAnnotations.DatabaseGeneratedOption.Identity)]
    public int Id
    {
        get { return _Id; }
        set { _Id = value; }
    }

    private string _Title;

    [Required]
    [MaxLength(50)]
    public string Title
    {
        get { return _Title; }
        set { _Title = value; }
    }

    private ICollection<Product> _MainUnitedProducts;
    [InverseProperty("MainUnit")]
    public virtual ICollection<Product> MainUnitedProducts
    {
        get { return _MainUnitedProducts; }
        set { _MainUnitedProducts = value; }
    }

    private ICollection<Product> _SubsidiaryUnitedProducts;
    [InverseProperty("SubsidiaryUnit")]
    public virtual ICollection<Product> SubsidiaryUnitedProducts
    {
        get { return _SubsidiaryUnitedProducts; }
        set { _SubsidiaryUnitedProducts = value; }
    }

    private ICollection<Product> _SnachUnitedProducts;
    [InverseProperty("SnachUnit")]
    public virtual ICollection<Product> SnachUnitedProducts
    {
        get { return _SnachUnitedProducts; }
        set { _SnachUnitedProducts = value; }
    }

}

如你所见,我在这些entitis之间有一对多的关系:

Product.MainUnitId        *-----1     Unit.Id
Product.SubsidiaryUnitId  *-----1     Unit.Id
Product.SnachUnitId       *-----1     Unit.Id

但是当我使用Context.Database.Create()时发生了意外错误

在表'Products'上引入FOREIGN KEY约束'FK_Products_Units_SubsidiaryUnitId'可能会导致循环或多个级联路径。 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。

有没有人在那里帮助我?! 我是否使用InverProperty映射和ForeignKey映射?

多谢你们

Foroughi

例外来自SQL Server。 您必须关闭三个关系的级联删除(它由映射约定启用,因为您的关系是必需的而不是可选的)。 遗憾的是,您无法使用数据注释,但只能使用Fluent API:

modelBuilder.Entity<Product>()
    .HasRequired(p => p.MainUnit)
    .WithMany(u => u.MainUnitedProducts)
    .HasForeignKey(p => p.MainUnitId)
    .WillCascadeOnDelete(false);

其他两种关系也一样。 您可以删除[ForeignKey][InverseProperty]注释,因为Fluent API中的此映射已经定义了反向键和外键属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM