“参照完整性约束违规。依赖角色具有多个具有不同值的主体。”

时间:2013-12-31 04:17:25

标签: entity-framework

我之前发布了问题here,但经过深入调查后,我得出结论,问题实际上与我在视图和表格之间创建的关联有关。

我附上了一个包含可运行解决方案的示例解决方案来演示问题,可以找到here

创建示例代码所采取的步骤。

  1. 创建数据库并运行TSQL脚本脚本以生成对象(解决方案zip中的脚本)

  2. 创建.emdx然后添加所有实体,包括vListing视图

  3. 如此处所示创建了一个新关联 enter image description here

  4. 手动修改.emdx只将ListingID作为主键而不是ListingID和Name(这必须手动完成,因此可以创建约束,因为EF设计器在挑选应该是主键时会出错视图

  5. 创建约束,如下所示

  6. enter image description here

    运行代码后,Test1和Test2方法都会失败,因此将子项直接添加到上下文或实体并不重要。

    更新:(代码不起作用)

    class Program
    {
        static void Main(string[] args)
        {
            Test1();
            Test2();
    
        }
        private static void Test2()
        {
            var listings = new List<Listing>();
    
            for (int i = 0; i < 10; i++)
            {
                var listing = new Listing
                {
                    ListingID = i,
    
                    Name = "Name " + i.ToString()
                };
                listing.ListingTypes.Add(new ListingType
                {
                    Listing = listing,
                    TypeID = 1
                });
    
    
                listings.Add(listing);
            }
    
            using (var context = new ReferentialErrorContext())
            {
                context.Listings.AddRange(listings);
    
                context.SaveChanges();
            }
        }
        private static void Test1()
        {
            var listings = new List<Listing>();
            var types = new List<ListingType>();
            for (int i = 0; i < 10; i++)
            {
                var listing = new Listing
                {
                    ListingID = i,
                    Name = "Name " + i.ToString()
                };
                var type = new ListingType
                {
                    Listing = listing,
                    TypeID = 1
                };
                types.Add(type);
    
                listings.Add(listing);
            }
    
            using (var context = new ReferentialErrorContext())
            {
                context.Listings.AddRange(listings);
                context.ListingTypes.AddRange(types);
                context.SaveChanges();
            }
    
        }
    
    
    }
    

1 个答案:

答案 0 :(得分:3)

我p了一下,似乎是EF中的一个合法的错误。我在the bug you created中写了更多详细信息。我找到了一个工作,就是设置要添加到唯一值的实体的Listing.ListingID属性的值(这样你总是可以从0开始计数并增加新实体的值 - 然后你可以重置为0之后调用SaveChanges()或者你可以继续计数,因为只要它对于被保存的实体是唯一的,值就不重要了。这不应该有任何副作用,因为该属性标有StoreGeneratedPattern="Identity",因此该值将被数据库生成的值覆盖。

以下是代码段:

var listing = new Listing
{
    ListingID = i, // this is the line I added
    Name = "Name + i.ToString()
};

编辑

显然那里有更多的怪异。除了必须设置ListingId之外,必须在将相关实体添加到上下文之前将列表添加到上下文中,并且不能显式添加相关实体。我重写了Test2()如下:

private static void Test2()
{
    using (var context = new ReferentialErrorContext())
    {
        for (var i = 0; i < 10; i++)
        {
            var listing =
                context.Listings.Add(
                    new Listing
                    {
                        ListingID = i,
                        Name = string.Format("Name {0} {1}", DateTime.Now, i)
                    });

            listing.ListingTypes.Add(new ListingType
            {
                ListingTypeID = i,
                Listing = listing,
                TypeID = 1
            });

        }

        context.SaveChanges();
    }
}

它似乎工作 - 没有抛出异常并且数据被添加到数据库中。