我之前发布了问题here,但经过深入调查后,我得出结论,问题实际上与我在视图和表格之间创建的关联有关。
我附上了一个包含可运行解决方案的示例解决方案来演示问题,可以找到here。
创建示例代码所采取的步骤。
创建数据库并运行TSQL脚本脚本以生成对象(解决方案zip中的脚本)
创建.emdx然后添加所有实体,包括vListing视图
如此处所示创建了一个新关联
手动修改.emdx只将ListingID作为主键而不是ListingID和Name(这必须手动完成,因此可以创建约束,因为EF设计器在挑选应该是主键时会出错视图
创建约束,如下所示
运行代码后,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();
}
}
}
答案 0 :(得分:3)
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();
}
}
它似乎工作 - 没有抛出异常并且数据被添加到数据库中。