【问题标题】:Create more than one (one to many) relations between to entity by code first approach model in EF4.3在 EF4.3 中通过代码优先方法模型在实体之间创建多个(一对多)关系
【发布时间】:2012-01-29 03:49:23
【问题描述】:

感谢关注。 在开发会计程序的过程中,我遇到了一个流动的问题,需要一些工程师的帮助。

我要实体:Productunit

 [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; }
    }

}

如你所见,我在这些实体之间存在一对多的关系:

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 映射对吗?

谢谢大家

福罗伊

【问题讨论】:

  • 对不起,我的语法不好,我是英文新手,任何细节评论我更新我的q,谢谢

标签: c# entity-framework code-first


【解决方案1】:

异常来自 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 中的此映射已经定义了逆键和外键属性。

【讨论】:

  • 必需而不是可选的......!!如果我将这些属性设置为可选,我的问题将得到解决?!
  • @AliForoughi:是的。请记住,对于可选关系(public int? MainUnitId 等),您需要使 FK 属性可以为空。但是你不应该仅仅为了解决这个问题而使关系成为可选的。如果在您的模型中产品总是必须有 MainUnit 是正确的,那么关系是必需的。就我个人而言,我更愿意关闭级联删除。
  • aaa 我觉得你说得对,我也很草率。所以看来我应该把它关掉了,所以请等待测试它,
  • 好吧,看来行得通,谢谢老兄,你帮助了我,你的回复现在被我接受了。再次感谢,祝你好运
猜你喜欢
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
相关资源
最近更新 更多