我在Sqlserver中有3个实体,我使用visual Studio向导进行映射
这三个实体是包类别和packages_categories,其中packages_categories有多对多的关系。 在映射这些实体后,我正在设置2个类,它们是类别和包,它们看起来像这样: 公共部分类包 { 公共包() { this.Categories = new HashSet(); }
public string PackageSid { get; set; }
public string PackageName { get; set; }
public virtual ICollection<Category> Categories { get; set; }
}
公共部分类别 { 公共类别() { this.Packages = new HashSet(); }
public int CategoryId { get; set; }
public string CategoryName { get; set; }
public bool isDefault { get; set; }
public virtual ICollection<Package> Packages { get; set; }
}
我对多对多关系的实体没有任何意义(这是packages_categories之一) 当我试图从包中获取信息时,Thing工作得很好然后每当我尝试查询包时,我会得到它的ist包和当我尝试获取类别包时的相同Thing。
问题是,当我尝试更新包并向其添加类别时,该类别不仅会添加到权利packages_categories,还会添加到类别self
代码示例:
var categoriesList=List<Categoriy>();
categoriesList.Add(new Cateogry{
categoryname="catem",
IsDefault=false,
CategoryId=2332
});
var _packagesContext=new DBPackages();
_packagesContext.Add(new Packages{
packageSid="Sid blaaa.",
PackageName="TestPackage",
Categories=categoriesList
});
现在在这段代码中,一个类别的包将被添加到数据库中,但是如果该类别已经存在,则会抛出一个类别已经存在的异常(假设它已经存在,这意味着它尝试将它添加到Categories self),
我怎样才能解决这样的问题?我究竟做错了什么 :( 非常感谢。
答案 0 :(得分:2)
为了避免创建新类别,您必须在添加新包之前将它们附加到上下文中:
var _packagesContext=new DBPackages();
categoriesList.ForEach(c => _packagesContext.Categories.Attach(c));
_packagesContext.Add(new Packages {
packageSid="Sid blaaa.",
PackageName="TestPackage",
Categories=categoriesList
});