2 Stimmen

Nhibernate Datenbindung Fremdschlüssel zu LookupEdit

Ich möchte die Fremdschlüsseleigenschaft Product.CategoryId an ein Devexpess Lookupedit in einer Windows Forms-Anwendung binden.

        lookEditCategory.DataBindings
       .Add(new Binding("EditValue", Product, "CategoryId ", true,
        DataSourceUpdateMode.OnPropertyChanged));

        lookEditCategory.Properties.Columns.Clear();
        lookEditCategory.Properties.NullText = "";
        lookEditCategory.Properties.DataSource = CatCol;
        lookEditCategory.Properties.ValueMember = "CategoryId";
        lookEditCategory.Properties.DisplayMember = "CategoryName";
        var col = new LookUpColumnInfo("CategoryName") { Caption = "Type" };
        lookEditCategory.Properties.Columns.Add(col);

Das Problem ist, dass NHibernate die Fremdschlüssel-ProduktkategorieID nicht freigibt. Stattdessen sieht mein Entity und Mapping so aus

public partial class Product
{
public virtual int ProductId { get; set; }
[NotNull]
[Length(Max=40)]
public virtual string ProductName { get; set; }
public virtual bool Discontinued { get; set; }
public virtual System.Nullable SupplierId { get; set; }

[Length(Max=20)]
public virtual string QuantityPerUnit { get; set; }
public virtual System.Nullable UnitPrice { get; set; }
public virtual System.Nullable UnitsInStock { get; set; }
public virtual System.Nullable UnitsOnOrder { get; set; }
public virtual System.Nullable ReorderLevel { get; set; }

private IList _orderDetails = new List();

public virtual IList OrderDetails
{
  get { return _orderDetails; }
  set { _orderDetails = value; }
}

public virtual Category Category { get; set; }

public class ProductMap : FluentNHibernate.Mapping.ClassMap
{
  public ProductMap()
  {
    Table("`Products`");
    Id(x => x.ProductId, "`ProductID`")
      .GeneratedBy
        .Identity();
    Map(x => x.ProductName, "`ProductName`")
;
    Map(x => x.Discontinued, "`Discontinued`")
;
    Map(x => x.SupplierId, "`SupplierID`")
;

    Map(x => x.QuantityPerUnit, "`QuantityPerUnit`")
;
    Map(x => x.UnitPrice, "`UnitPrice`")
;
    Map(x => x.UnitsInStock, "`UnitsInStock`")
;
    Map(x => x.UnitsOnOrder, "`UnitsOnOrder`")
;
    Map(x => x.ReorderLevel, "`ReorderLevel`")
;
    HasMany(x => x.OrderDetails)
      .KeyColumn("`ProductID`")
      .AsBag()
      .Inverse()
      .Cascade.None()
;
    References(x => x.Category)
      .Column("`CategoryID`");
  }
}
}

Ich kann die Eigenschaft CategoryID nicht zu meinem Produkt-Entity und Mapping hinzufügen, weil sie dann doppelt zugeordnet wird. Gibt es irgendwelche Lösungen?

0voto

J. Ed Punkte 6674

Ja. Verwenden Sie NICHT Ihre Domänenentitäten im UI.
Manchmal benötigt Ihr UI nicht alle Eigenschaften Ihrer Domain-Objekte (und sollte diese auch nicht kennen).
Manchmal benötigt es DTOs, die Daten aus verschiedenen Domain-Quellen enthalten (zum Beispiel eine Liste von CourseNames für den Student-Bildschirm) oder, wie in Ihrem Fall, dass die Daten auf eine etwas andere Weise dargestellt werden.
Der beste Weg wäre also, Ihre DTOs mit allen (und nur) Eigenschaften zu erstellen, die vom UI benötigt werden.
Siehe diese SO-Frage für weitere Details.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X