gpt4 book ai didi

vb.net - Automapper:如何忽略 EF (VB.NET) 中的导航属性

转载 作者:行者123 更新时间:2023-12-04 04:35:43 26 4
gpt4 key购买 nike

我是 EF 和 AutoMapper 的新手,我正在尝试使用它来创建 Web 服务。如果我尝试直接序列化 EF 实体,导航属性会抛出错误,因为它们无法序列化。我想找到一种方法来抑制它们,有人告诉我最好的方法是创建 POCO 以用作数据传输对象。

(此时我想我还不如使用 ADO.NET 编写自己的 DTO - EF 不应该让我省去编写自己的类的麻烦吗?)

我已经向我推荐了 AutoMapper 作为自动将 EF 实体映射到 POCO 的方法,因此我尝试在以下过程中使用它,该过程加载了 POCO:

Public Sub Load(ByVal lngUserId As Long)

Dim query = From u In db.Users
Where u.UserID = lngUserId
Select u

AutoMapper.Mapper.Map(query.FirstOrDefault(), Me)

End Sub

问题是,它出现了一个错误,结果证明它再​​次与导航属性相关,它似乎不会被 AutoMapper 自动忽略。

因此,我尝试添加此行以强制 AutoMapper 忽略导航属性:
Dim oMap = Mapper.CreateMap(Of User, UserDto).ForSourceMember(Sub(src) src.tblUserFarms, Sub(opt) opt.Ignore())

(tblUserFarms 是导航属性)

我从我找到的 C# 示例中为此转换了语法,但似乎 .ForSourceMember 的第一个参数不应该是 Lambda 表达式,而且我找不到如何使用它的好示例。

我使用的是正确的方法,还是应该完全尝试其他方法?我是否应该简单地删除我所有的导航属性来解决这个问题,并失去它们的好处? EF 甚至是适合这项工作的工具吗?

最佳答案

下面是我一直在做的代码片段。有了忽略,我避免了加载导航属性对象(也提高了性能)。

public domain.Entities.UserProfile GetUserProfile(string userName)
{

Mapper.CreateMap<Entities.UserProfile, domain.Entities.UserProfile>()
.ForMember(dest => dest.BillingAddress, opt => opt.Ignore())
.ForMember(dest => dest.ShippingAddress, opt => opt.Ignore())
.ForMember(dest => dest.Orders, opt => opt.Ignore())
.ForMember(dest => dest.ShoppingCartItems, opt => opt.Ignore());

Entities.UserProfile storedProfile = db.UserProfiles.FirstOrDefault(x => x.UserName.Equals(userName));
var profile = Mapper.Map<Entities.UserProfile, domain.Entities.UserProfile>(storedProfile);

return profile;
}

这就是我定义我的 UserProfile 的方式
 public class UserProfile
{
public virtual int UserId { get; set; }
public virtual string UserName { get; set; }
public virtual string Prefix { get; set; }
public virtual string FirstName { get; set; }
public virtual string MiddleName { get; set; }
public virtual string LastName { get; set; }
public virtual string EmailAddress { get; set; }
public virtual string Company { get; set; }
public virtual string PhoneNumber { get; set; }
public virtual string FaxNumber { get; set; }

private ICollection<ShoppingCartItem> _shoppingCartItems;
private ICollection<Address> _addresses;
private ICollection<Order> _orders;

/// <summary>
/// Default billing address
/// </summary>
public virtual Address BillingAddress { get; set; }

/// <summary>
/// Default shipping address
/// </summary>
public virtual Address ShippingAddress { get; set; }

/// <summary>
/// Gets or sets customer addresses
/// </summary>
public virtual ICollection<Address> Addresses
{
get { return _addresses ?? (_addresses = new List<Address>()); }
protected set { _addresses = value; }
}

/// <summary>
/// Gets or sets orders
/// </summary>
public virtual ICollection<Order> Orders
{
get { return _orders ?? (_orders = new List<Order>()); }
protected set { _orders = value; }
}

/// <summary>
/// Gets or sets shopping cart items
/// </summary>
public virtual ICollection<ShoppingCartItem> ShoppingCartItems
{
get { return _shoppingCartItems ?? (_shoppingCartItems = new List<ShoppingCartItem>()); }
protected set { _shoppingCartItems = value; }
}

}

关于vb.net - Automapper:如何忽略 EF (VB.NET) 中的导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19779436/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com