在数据库中我有这些表:Product,Request和RequestProducts。 RequestProducts是一个将许多产品链接到一个请求的表。
这是我的代码:
Product newProduct = new Product
{
Unity_ID = 3,
Quantity = 2,
Name = "toto",
AlreadyCurrency = true
};
Request newRequest = new Request
{
User_ID = 1,
CaseNumber = 1,
Draft = false
};
newRequest.Products.Add(newProduct);
_db.AddToProducts(newProduct);
_db.AddToRequests(newRequest);
_db.SaveChanges();
执行后,在我的数据库中,我得到1个产品和1个请求。没关系,但是使用行newRequest.Products.Add(newProduct);
创建的链接不会创建表RequestProducts,而EF4通过在Request对象中提出Products
列表来理解链接。
是否可以仅使用此代码创建此链接?
谢谢!
答案 0 :(得分:0)
对于一对多关系,您不需要额外的表格。对于多对多关系,您只需要额外的表格。
所以,如果不知道你正在做什么以及为什么会有更多具体细节,我会说它运作正常。
理想情况下,您的Request对象看起来像:
public class Request
{
public int RequestId {get; set;}
//Other defining params here
public ICollection<Product> Products {get; set;}
}
然后你的Product对象看起来像:
public class Product
{
public int ProductId {get; set;}
//other defining params
public int RequestId {get; set;} //your FK
public virtual Request Request {get; set;} //If you ever need the Product to be aware of the Request to which it is attached.
}
答案 1 :(得分:0)
假设您使用EDMX的生成实体,您的RequestId
表中应该只有一个Product
FK列。
然后在从DB生成EDMX后,将不会有其他表,因此您应该能够这样做:
Request newRequest = new Request
{
User_ID = 1,
CaseNumber = 1,
Draft = false
};
Product newProduct = new Product
{
Unity_ID = 3,
Quantity = 2,
Name = "toto",
AlreadyCurrency = true,
Request = newRequest
};
//Redundant
//newRequest.Products.Add(newProduct);
_db.AddToProducts(newProduct);
//Redundant
_db.AddToRequests(newRequest);
_db.SaveChanges();
//Never forget - or wrap in a using statement
_db.Dispose()
更新
Request
(现在是Product
的属性)设置为newRequest
,然后将其添加到上下文(或者如果已添加) ),整个图形的所有相关实体也将自动添加。