2010-07-23 13 views
0

J'ai une entité de produit qui a une relation de clé étrangère avec le fabricant. Je veux rendre facultatif si l'utilisateur ajoutant un nouveau produit veut établir un fabricant.Modelbinder crée une relation étrangère inutile .. comment résoudre?

Dans mes create view je,

<%= Html.LabelFor(p => p.Manufacturer.Name) %> 
<%= Html.EditorFor(p => p.Manufacturer.Name) %> 

En action create,

public ActionResult Create(Product product) { 
    if (product.Manufacturer != null && 
     !String.IsNullOrEmpty(produnt.Manufacturer.Name) && 
     !String.IsNullOrWhiteSpace(produnt.Manufacturer.Name)) { 
     Manufacturer manufacturer = _session.Single<Manufacturer>(m => m.Name.Equals(produnt.Manufacturer.Name)); 

     if (manufacturer == null) { 
      _session.Add(product.Manufacturer); 
     } 
     product.Manufacturer = manufacturer; 
    } 
    _session.Add(product); 
} 

Dans le tableau des fabricants que j'ai simplement des colonnes d'identité et le nom. Le nom est défini sur NOT NULL. Chaque produit a ManufacturerID, qui peut être NULL. J'ai ajouté la relation FK de Manufacturer.ID < => Product.ManufacturerID.

J'ai également défini la valeur par défaut de Product.ManufacturerID sur null en utilisant l'annotation de données DefaultValue avec les métadonnées du modèle.

Cela fonctionne très bien lorsque je spécifie un fabricant lors de la création d'un produit. Mais lorsque je le laisse vide, un ID est affecté à Product.ManufacturerID dans la base de données, mais aucun fabricant n'est créé avec cet ID. Débogueur a montré que Product.Manufacturer.Name est null, mais pour une raison quelconque, Product.Manufacturer.ID et Product.ManufacturerID sont définis sur 0 (pas null). Comment puis-je faire en sorte qu'il quitte null Product.ManufacturerID lorsque aucun fabricant n'est spécifié?

Serait-il une meilleure idée de détacher l'entité du fabricant et ont l'apparence d'action comme celui-ci,

public ActionResult Create(Product product, Manufacturer manufacturer) { 
    // ... 
} 

Je suppose que trop compter sur le modèle de liaison n'est pas une bonne idée.

Répondre

0

Vous y êtes presque. Ce que vous devez faire est de créer un ensemble de Viewmodels pour le produit et le fabricant. En regardant le code, je suppose que votre classe de produit est une classe générée linq-à-sql.

Vous pouvez envisager d'ajouter un élément de formulaire supplémentaire, par exemple une case à cocher indiquant si vous souhaitez ajouter un fabricant ou non.

mais pour une raison Product.Manufacturer.ID et Product.ManufacturerID sont à 0 (non null)

comportement attendu depuis 0 est la valeur par défaut pour un int (qui ne peut être nulle)