我使用Entity Framework 4.3.1.0
SQL Server 2008 Express
我有意见
SELECT dbo.Dealers.Name AS DealerName,
dbo.Dealers.LogoImage,
dbo.DealersProducts.Price,
dbo.DealersProducts.StatusType,
dbo.Products.Description,
dbo.Products.Name,
dbo.DealersProducts.DealerId,
dbo.Products.Id
FROM dbo.Dealers
INNER JOIN
dbo.DealersProducts
ON dbo.Dealers.Id = dbo.DealersProducts.DealerId
INNER JOIN
dbo.Products
ON dbo.DealersProducts.ProductId = dbo.Products.Id
我有实体
public class DealerViews : BasePersistentEntity
{
public int DealerId { get; set; }
public string DealerName { get; set; }
public string LogoImage { get; set; }
public string Name { get; set; }
public string Description { get; set; }
public decimal Price { get; set; }
public int StatusType { get; set; }
}
此视图我用于退货经销商有请求产品。当我在SQL Manager中请求SQL查询时,我获得了正确的结果但在实体框架中我得到了奇怪的结果。 实例
SQL结果
经销商1
经销商2
实体框架结果
经销商1
经销商1
控制器中的代码
public ActionResult ShowProductDealers(int id)
{
var dealer = this.dealerService.GetDealerByProductId(id);
return this.PartialView("ShowProductDealers", dealer);
}
服务代码
public IEnumerable<DealerViews> GetDealerByProductId(int id)
{
return this.repositoryViews.All.Where(item => item.Id == id);
}
存储库中的代码
public class SGNRepository<T> where T : BasePersistentEntity
{
public readonly SGNContext<T> Context = new SGNContext<T>();
public IQueryable<T> All
{
get { return this.Context.Table; }
}
public IQueryable<T> AllIncluding(params Expression<Func<T, object>>[] includeProperties)
{
IQueryable<T> query = this.Context.Table;
return includeProperties.Aggregate(query, (current, includeProperty) => current.Include(includeProperty));
}
public T Find(int id)
{
return this.Context.Table.Find(id);
}
public void InsertOrUpdate(T item)
{
if (item.Id == default(int))
{
// New entity
this.Context.Table.Add(item);
}
else
{
// Existing entity
this.Context.Entry(item).State = EntityState.Modified;
}
this.Save();
}
public void Delete(int id)
{
var item = this.Context.Table.Find(id);
this.Context.Table.Remove(item);
this.Save();
}
private void Save()
{
this.Context.SaveChanges();
}
答案 0 :(得分:5)
您的映射存在问题。您选择哪个列作为实体的主键?我希望在这种情况下你有Product.Id
作为主键,这个产品有很多经销商。
EF使用主键作为唯一标识。必须唯一标识每条记录。如果EF加载记录并且它没有unique identification in its internal identity map,它将从该记录创建实体实例并将其放入标识映射。下次获取具有相同唯一标识的记录时,它不会创建新的实体实例,而是使用存储在标识映射中的实例。这就是你得到相同结果的原因。
顺便说一下。您的存储库是错误的,因为您无法插入,删除或更新从视图创建的实体(除非您为所有这些操作映射存储过程或自定义SQL命令),因此它不应公开此类方法。
另一点是,为什么在包装单个call = no add value时没有存储库和服务,并且没有理由这样做,特别是当您的存储库仅支持对一个实体类型的简单CRUD操作时。