EntityWrapper混淆

时间:2015-07-22 16:16:27

标签: wpf entity-framework-6 dependency-properties

WPF

Entity Framework 6.0

数据库首先,实体由TT文件生成。

我在 EntityWrapper 方面遇到了一些问题,但无法找到有关它的任何有用信息。

我有一些实体,生成时看起来像这样:

//generated code
public partial class scm_SupplierDepot : IPartsEntity, INotifyPropertyChanged
{
    [...]
    public virtual dms_Address dms_Address { get; set; }
}

public partial class dms_Address : IPartsEntity, INotifyPropertyChanged
{
    //shortened for brevity 
    public System.Guid AddressId  { get; set; }
    public string StreetNumber  { get; set; }
    public string StreetName  { get; set; }
    public string ApartmentNumber  { get; set; }
    public string City  { get; set; }
    public string StateProvince  { get; set; }
    public string PostalCode  { get; set; }
    public string HouseName  { get; set; }
    public string Country  { get; set; }
    public string Address2  { get; set; }
    public string County  { get; set; }

    //INotifyPropertyChanged 
    [..]
}

我使用接口稍微扩展了地址类:

public partial class dms_Address : IAddress {  } 

public interface IAddress
{
    String StreetNumber { get; set; }
    String StreetName { get; set; }
    String ApartmentNumber { get; set; }
    String Address2 { get; set; }
    String City { get; set; }
    String StateProvince { get; set; }
    String PostalCode { get; set; }
    String County { get; set; }
    String Country { get; set; }        
}

我从 scm_SupplierDepot 实体中获取 dms_Address 实体时遇到了一些困惑和问题。在大多数情况下,我可以将 Depot.dms_Address转换为IAddress ,并在没有任何问题的情况下使用该实体。

但是当我尝试将此对象绑定到自定义控件时,控件接收的实际对象是 EntityWrapper< dms_Address> EntityWrapperWithoutRelationships< dms_Address>

我必须让我的控件的依赖属性接受对象,而不是我喜欢的 IAddress 。现在我无法使用该对象,因为不会将强制转换为 IAddress 。我甚至无法将其转换为 EntityWrapper ,因为我无法确定要包含的正确名称空间。

    public static readonly DependencyProperty AddressProperty = DependencyProperty.Register("Address", typeof(object), typeof(AddressForm), new FrameworkPropertyMetadata(null, AddressChanged));
    public object Address 
    {
        get { return (object)GetValue(AddressProperty); }
        set { SetValue(AddressProperty, value); }
    }

有关我的自定义控件和此依赖关系属性问题的详细信息,请参阅上一个问题:WPF Custom Control: DependencyProperty never Set (on only 1 of many properties)

问题:

  • 有谁可以向我解释这里发生了什么?
  • 我不明白这个包装器的来源。我怎么能让它消失?
  • 如何让控件接收IAddress而不是包装器?
  • 或者我如何将EntityWrapper对象转换为IAddress,以便我可以访问代码中的属性? (奇怪的是模板绑定工作正常)

1 个答案:

答案 0 :(得分:0)

我想出了如何使用Reflection做我需要的。

        Type objectType = Address.GetType();
        Type iAdd = objectType.GetInterface("IAddress");

        if (iAdd != null)
        {
            PropertyInfo info = objectType.GetProperty("StateProvince");
            if (info != null)
            {
                string currentProvince = info.GetValue(Address) as string;

                if (currentProvince != newValue)
                    info.SetValue(Address, newValue);
            }
        }

我仍然难以理解为什么我会看到这种行为;如果它有界面,为什么我不能投射呢?

Type iAdd = Address.GetType().GetInterface("IAddress"); //iAdd is not null,
IAddress IA = (Address as IAddress); //IA is null

最后,我设法切换了我的代码以使所有代码不必要>。<