2015-03-13 61 views
2

我使用实体框架与Code First创建数据库等。如何首先需要与代码的多对多关系

public class Company : Entity // Entity contains an ID and a RowVersion 
{ 
    // some Properties 
    // 
    public virtual ICollection<Profile> Profiles { get; set; } 
} 

// No Attributes here, because this Model has to be reusable 
public class Profile : Entity 
{ 
    // some Properties 
    // 
    public virtual ICollection<Company> Companies { get; set; } 
} 

我想要求公司拥有一个用于管理该公司的配置文件(cn:n)。我有一些负责编辑实体的“业务逻辑”,主要是因为验证部分。逻辑会验证是否设置了所需的关系。我在这里有两个问题:

DB应该有可选关系(用于编辑方便)吗? “业务逻辑”必须是唯一编辑数据库的人员。

或者我会如何设置所需的关系?


我不介意,如果你有一点当然,在我看来,与EF在互联网上的多对多关系太少了。 (我是新来的,所以从来不介意,如果这违背一些规则)


编辑 我所知道的与第三个表的方式,但是这是我的观点:How to require many to many relation with code first

+0

你有没有想过创建第三实体搞定N:N的关系? – 2015-03-13 14:27:32

+0

@Guillelon是的,我有,那将是紧急的选择。但是,代码的第一点是你不必关心数据库如何执行它,你只关心类。以这种方式,没有任何其他属性的第三类(加上另外三个关系类,我有很多多对多的关系)不会是理想的。 – lukee910 2015-03-13 14:33:20

回答

2

您需要通过实现IValidatableObject接口将您的实体变为可验证对象,并使用一种方法检查集合中是否至少有一个项目。该方法被称为EF当你打电话SaveChanges()

public class Company : Entity, IValidatableObject 
{ 
    public virtual ICollection<Profile> Profiles { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (!Profiles.Any()) 
      yield return new ValidationResult("Company must have at least 1 Profile"); 
    } 
} 

public class Profile : Entity, IValidatableObject 
{ 
    public virtual ICollection<Company> Companies { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (!Companies.Any()) 
      yield return new ValidationResult("Profile must have at least 1 Company"); 
    } 
} 

参考:IValidateableObject example

3

当出现这种情况时(多对多)设计数据库时,请使用附加表来区分这一点。例如,我们有两个表t1和t2,其中t1从多到多到t2,创建一个相关的表t3: t1一对多到t3和t2一对多t3。

在你的情况,你需要创建一个额外的类,像这样:

public class CompanyProfile { 
    public virtual ICollection<Company> Companies { get; set; } 
    public virtual ICollection<Profile> Profiles { get; set; } 
} 

在你classees公司和个人信息的链接公司简介类。

+0

你是对的,但也[那](http://stackoverflow.com/questions/29034357/how-to-require-many-to-many-relation-with-code-first?noredirect=1#comment46310537_29034357) 。 - >在问题编辑 – lukee910 2015-03-13 14:36:29

+0

@LukasDörig好吧,我通常用这种方式来解决我的任务。我不知道,但也许这可以帮助你:https://msdn.microsoft.com/en-us/data/jj591620.aspx#ManyToMany – netwer 2015-03-13 14:42:55

+2

@netwer为什么列表的元素?而不是ElementId? – adricadar 2015-03-13 14:45:35

相关问题