0

J'ai la conception CodeFirst comme ceci:clé étrangère avec la logique OU

public class Email 
{ 
    public string Address { get; set; } 

    public Company Company { get; set; } 
    public int? CompanyId { get; set; } 

    public User User { get; set; } 
    public int? UserId { get; set; } 

    //many other props 
} 

public class Company 
{ 
    public List<Email> Emails { get; set; } 
} 

public class User 
{ 
    public List<Email> Emails { get; set; } 
} 

Dans une bonne façon, le courriel peut appartenir à une seule clé étrangère: COMPANYID ou UserId. Mais maintenant, il permet CompanyId et UserId. C'est faux. Quoi qu'il en soit, ce design avec nullables est moche. Par exemple, pour obtenir tous les e-mails liés aux entreprises que je dois faire:

var companyEmails = _context.Emails.Where(x => x.CompanyId.HasValue); 

Je pense qu'il ya une meilleure approche pour définir les clés étrangères se multiplient avec OU logique. S'il vous plaît, aidez-moi à trouver un moyen.

Répondre

0

Si vous voulez avoir la seule référence à Company ou User, cela signifie qu'il ne sera pas FK et aussi vous devriez avoir champ supplémentaire avec la description, à quelle table ce points sur le terrain.

Vous pouvez également essayer l'approche Table par hiérarchie. A cette table de base de données cas restera à peu près la même, seule nouvelle colonne Discriminator sera ajouté implicitement, de distinguer les classes, mais vous pouvez écrire plus « élégant » code:

public abstract class Email 
{ 
    public string Address { get; set; } 
} 

public class CompanyEmail : Email 
{ 
    public Company Company { get; set; } 
    public int? CompanyId { get; set; } 
} 

public class UserEmail : BaseEmail 
{ 
    public User User { get; set; } 
    public int? UserId { get; set; } 
} 

Utilisation:

var companyEmails = _context.Emails.OfType<CompanyEmail>(); 
//underlying query: 
//select * from dbo.Emails where Discriminator = 'CompanyEmail' 
+0

Merci beaucoup! btw il y a un [bon tutoriel pour les stratégies d'héritage] (http://www.entityframeworktutorial.net/code-first/inheritance-strategy-in-code-first.aspx) –